Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 17:16

Foren-Übersicht » Sonstiges » Meinungen zu den Projekten
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 50 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 10:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Michael,
anbei die Übersetzung des Tutorials als RichTextFile. Ich habe doch den größten Teil davon übersetzt. Bloss die ersten beiden und den letzten Absatz habe ich weggelassen, schien nicht wirklich wichtig zu sein. Ich habe auch erst zu spät bemerkt, dass Du wohl kaum den letzten Abschnitt über die MouseWheel Events brauchen können wirst, weil er total veraltet ist, Ich glaube nicht, dass Lazarus das so macht; in Windows kriege ich meine Mousewheel Events einfach mit der normalen WM_MOUSEWHEEL-Message, ich kenne aber das interne Botschaftshandling von Lazarus nicht. Ich habe auch im Text angemerkt, dass dieser Abschnitt veraltet ist. Alles andere scheint brauchbar zu sein.

Viele Grüße
Traude


Dateianhänge:
ScrollbarsTutorial.zip [41.77 KiB]
335-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 10:11 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Erstmal Vielen Dank für deine Mühe. Ich glaube Lazarus macht das Intern genauso wie Delphi mit den Botschaften.
Allerdings müsste man sie etwas anpassen. Bisher habe noch keine WM_MOUSEWHEE gefunden.
Aber das ist auch nicht so wichtig. Ich werde es mir gleich durchlesen.

Darf ich das auch in einen anderen Forum hochladen ? z.b. dem LazarusForum ?

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 10:14 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Ja, sicher. Ich habe vorne dran geschrieben, dass es nur für den privaten Gebrauch gedacht ist, und ich habe auch die Quelle angegeben, damit jemand den Text - der zwar nicht wörtlich, aber sinngmäß richtig übersetzt ist - mit dem englischen Original vergleichen kann.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 10:59 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
So, ich habe ihn jetzt durchgelesen. Nicht schlecht. Leider habe ich das gefühl das diese Technik nur für schriften die gleich groß sind gedacht ist.
Ein Wichtiger Punkt habe ich nicht gefunden im Text: Der Caret also die Cursor Position wird gesetzt dann sollte ja auch gescrollt werden.

Ich werde mir den Text aber noch einige male durchlesen. Der Scheint auch mit der WinAPI zu arbeiten. Aber das macht nix. Ich denke heute Abend könnte ich mich noch mal aufraffen und einige Tipps aus deiner Übersetzung versuchen.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 13:47 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
BEISPIEL FÜR DAS BERECHNEN EINER VERTIKALEN SCROLLPOSITION AUFGRUND DER CARET POSITION

TextFile hat 100 Zeilen
===> Daraus folgt: VertScrollBar.Min = 0
VertScrollBar.Max = 100

Zeilenhöhe = 25 Pixel (= Schrifthöhe und ein paar Pixel Zeilenzwischenraum)
der Clientbereich des Formulars ist Breite=400 Pixel,Höhe=500 Pixel
===> Daraus folgt: auf eine Seite gehen FormularHöhe/Zeilenhöhe = 500/25 = 20 Zeilen
VertScrollBar.Page = 20

Annahme: Aktuelle erste angezeigte Zeile hat den Listenindex 45 (das Programm muss immer wissen, welchen Index die erste angezeigte Zeile hat, bei jedem Scrollevent ist nicht nur ein Neuzeichnen nötig sondern auch die Ermittlung des Index der neuen ersten Zeile)

Annahme: CaretPos: X=20,Y=63 (diese Info kommt aus dem Event, das sind natürlich Pixel)

angeklickte Zeile = CaretYPos/Zeilenhöhe = 63/25 ~ 2,52, aufgerundet 3
das bedeutet, das Caret steht in der dritten Zeile, die am Bildschirm angezeigt ist

Die dritte angezeigte Zeile hat folgenden Index

angezeigte
Zeile ********* Index
1 ************ 45 (laut Angabe, siehe oben)
2 ************ 46
3 ************ 47

Lösung: Die Vertikale Scrollbar muss mit dem Wert 47 gefüttert werden, damit sie die Balkenposition wieder richtig anzeigen kann.

Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 15, 2008 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Ich werde mal ausprobieren, und mal sehen wie weit ich komme. Aber im Tutorial wird davon ausgegangen das ich mit einer Festen Schrift Größe arbeite. Wobei der Autor dafür auch noch keine Lösung hat. Aber ich denke einen Schritt nach dem anderen.

Wenn ich das mit den Festen Schrift Größen hinbekomme ist das mir estmal viel wert.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 16, 2008 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Ich habe jetzt versuch die Scroll Funktion einzubauen, genau wie im Tutorial beschrieben, jedoch habe ich leider Probleme ich weiß einfach nicht mehr weiter.

Erstmal wird FirstLine falsch gesetzt beim Scrollen, es bleibt einfach null.
Code:
  1.  
  2.   SB_THUMBPOSITION,SB_THUMBTRACK: begin
  3.     TextBuffer.m_nVScrollPos :=GetTrackPos32(Handle, SB_VERT);
  4.    // writeln('m_nVScrollPosA:',TextBuffer.m_nVScrollPos);
  5.     //TextBuffer.DrawText;
  6. //    SetupScrollbar;
  7.      Refresh;
  8.    end;
  9.  


Leider bleibt TextBuffer.m_nVScrollPos auch immer null, egal wie ich den Scrollbalken verwende. Ich habe in meinem ersten Beitrag von diesem Thread hier, eine neue Version hochgeladen.
Evlt. könntest du mal schauen wo mein Fehler liegt, kann natürlich auch sein, das meine Schrift ungeignet ist, allerdings kommt damit Synedit zurecht. und ich meine SynEdit kann auch nur mit Festen Schrift Größen arbeiten.

Ich weiß einfach nicht mehr weiter. Leider wird auch nirgends rcPaint gesetzt. aufjedenfall im Tutorial.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 23, 2008 16:45 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Pluto,
tut mir leid, ich habe Dein Post erst heute gesehen. Ich habe mir deinen Editor-Code heruntergeladen. Ich habe versucht, das zu reparieren, aber ich habe vor Deinem TextBuffer kapitulieren mussen, weil ich keine Ahnung mehr hatte, welche Variable was wo macht.

Daher habe ich ein ganz einfaches Textanzeige-Control nach Deinem Muster geschrieben, das nur mit einer vertikalen ScrollBar arbeitet, aber wo Du sehen kannst, wie ich das gemacht habe, und hänge es hier herein. Ich habe kein Lazarus, das ist ein Windows-Programm. Aber es funktioniert ganz ähnlich, Du wirst nicht soviel ändern müssen, um es zum Laufen zu bringen. Die Units in der Uses-Klausel müssen natürlich jedenfalls geändert werden.
Traude


Dateianhänge:
TextEditor.zip [1.82 KiB]
338-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 23, 2008 21:20 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Ersteinmal Vielen Dank für dein tolles Beispiel. Ich habe es leicht angepasst wegen Lazarus. Aber es läuft. Mal schauen ob ich es erweitern kann nach meinen Vorstellungen.
Als nächstes versuch ich dort mal das Horizontale Scrollen einzubauen.

Zitat:
tut mir leid, ich habe Dein Post erst heute gesehe

Das passiert mir aber auch öfter das ich antworten übersehe weil ich der E-Mail Benachrichtigung einfach zu sehr glaube.
Aber ich finde es gut das du mich nicht "Vergessen" hast :D

Da du mir im Moment so toll weiter hilfst, kann ich dir irgenwie helfen ?

edit01:
Das Horizontale Scrollen konnte ich hinzufügen. Dank deiner "Vorarbeit". Jetzt ist es mein Ziel eine die Scroll Position abhängig von der Cursor Position zu berechnen.
Ich hoffe du hast nix dagegen wenn ich erstmal dein Projekt erweitere, nach meinen Vorstellungen ?

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 06:41 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Selbstverständlich nicht. Es ist Deins. Du kannst mir helfen, wenn Du es verstehst. Immer wenn ich seh, dass jemand Ambitionen hat und auf ein Problem aufläuft und nur einen Millimeter von der Lösung entfernt ist, krieg ich nämlich Bauchschmerzen. 8)

Noch ein Tip: Ich selber verwende fürs Testen von Dingen, in denen ich noch wenig Erfahrung habe, immer ein winziges Testprogramm. Wenn man im Projekt selbst testet, kann es vorkommen, dass man den Wald vor lauter Bäumen nicht mehr sieht.

Zum Errechnen der Caret Positionen habe ich oben ein Beispiel geschrieben.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 13:12 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Zitat:
Noch ein Tip: Ich selber verwende fürs Testen von Dingen, in denen ich noch wenig Erfahrung habe, immer ein winziges Testprogramm. Wenn man im Projekt selbst testet, kann es vorkommen, dass man den Wald vor lauter Bäumen nicht mehr sieht.

Ja ! Das mache ich eigentlich auch so, darum auch das "Test" Projekt. Aber ich habe mich entschieden, sobald das Scrollen in "unser" Projekt jetzt richtig läuft werde ich nochmal komplett von vorne anfangen und zwar mit nur einer TObjectList. Alles andere ist Blödsin finde ich weil es viel zu aufwendig ist.

Zitat:
Selbstverständlich nicht. Es ist Deins.

Nochmals Vielen Dank! Ich hoffe das ich die letzten Probleme alleine lösen kann.

Zitat:
Zum Errechnen der Caret Positionen habe ich oben ein Beispiel geschrieben.

Das werde ich mir gleich nochmal anschauen ob ich jetzt damit was anfangen kann.
Ach ja noch was: Ich habe ein klein Test gemacht die Buchstaben sind wirklich alle gleich Groß. Ich frage mich wie das ganze mit Buchstaben unterschiedlicher Größe klappen könnte. Aber das ist erstmal für mich nicht so wichtig. Aber Interessant währe es schon.

Zitat:
Du kannst mir helfen, wenn Du es verstehst.

Schön. Dann sagt mir mal wo ich dir genau helfen könnte. Dann könnte ich sagen ob ich das verstehe oder nicht. Wenn es um Komponenten geht, dürfte das für mich kein Problem sein, solange die Scroll Funktion "schon" eingebaut ist.

Aber wenn ich mir jetzt die Scroll Funktion so ansehe müsste ich das ganze auch in meiner GUI verwenden können. Allerdings hätte ich da das Problem z.b. bei der ListBox: Die Zeilen sind bzw. können unterschiedlich hoch sein und das mach schon was aus. Bei den ListBoxen verwende ich auch meine Label Komponente. Aber das dürfte egal sein.

Wir könnten ja hier uns noch etwas über "Editor" Komponenten unterhalten, wen du nix da gegen hast, zwischendurch werde ich aber weiterhin wenn ich Probleme habe eine Frage dazu stellen.

Soweit ist das ja schon alles ganz gut. Ich frage mich immer noch wie man am besten die "Buchstaben\Text" verwalten könnte. Ich habe in Laufe der Zeit verschiedene Systeme getestet. Aber heute kommt mir die Verwendung von "nur" einer TObjectList doch noch am einfachsten vor. Alle Buchstaben kommen als Objekte in einer einzigen TObjectList rein.
Wenn eine neue Zeile anfängt wird einfach nur noch eine Marke gesetzt und gut ist. Es gibt hier bei jedoch einige Probleme beim setzten des Y Cursors. Weil ich kann den nicht einfach
hoch bzw. runter zählen. Weil ich ja wegen der ObjectList ein festen Index brauche. z.b. um ein Buchstaben einzufügen oder einen Text zu löschen. oder so.

Später ist es aber ein leichtest z.b. die Möglichkeit hinzuzufügen den Text unterschiedlich auszusehen zu lassen. Z.B. das eine Wort rot das andere Grün.
Ich hätte aber nicht da gedacht das abgesehen von meinem eigentlich Ziel die anderen aufgaben so "aufwendig" sind.

Aber was ich immer wieder sagen muss: Ich finde es toll das ihr so offen Zeit für solche sachen die es schon wie Sand am Meer gibt.

Meine Lieblings Komponente ist aber die ListBox. Da hatte ich mal eine geschrieben für Delphi die konnte große Text Datei sehr viel schneller laden als die eigentliche Windows ListBox. Aber leider wurde sie nie richtig Fertig.

Ich finde das erstellen von eigenen Komponenten recht Interessant im Moment. Vorallem die Gedanken die man sich dabei machen muss.

Hier noch mal meine Ziele bei der Text Editor Komponente:
Erstmal möchte ich sowas wie ein erweitertest Memo erstellen. Es soll ein Gutter haben wie bei SynEdit. Wo Zahlen und Sprungmarken angezeigt werden können.
Wenn ich soweit bin, wollte ich sowas wie RichEdit erstellen. Allerdings recht einfach gehalten.
Zum Schluss möchte ich noch sowas wie SynEdit erstellen, wobei ich gerne auf die uniSynEdit Dateien zurückreifen möchte, weil die können über 300 Sprachen verstehen.
Ob mir das gelinkt weiß ich natürlich noch nicht. Aber so stelle ich mir das Projekt eigentlich vor.
Ob das jetzt "nur" mit schrift arten geht die eine Feste Größe haben ist mir erstmal egal. Hauptsache ich bekomme mein erstes Ziel "gebacken". Das würde mir schon viel bedeuten.
Bei der Memo Komponente habe ich mir folgende Funktionen überlegt:
01 - Texte Laden
02 - Text Cursor Steuern
03 - Markieren
04 - Texte Bearbeiten(Löschen, Kopieren, Einfügen,...)
05 - Scrollen
----
06 - Speichern
07 - Suchen
08 - Ersetzten
09 - Drucken(evlt.)

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 13:20 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Ich habe mir deine "ersten" antworten auf der ersten seite noch mal durchgeschaut aber ich "finde" leider die Antwort nicht.
ich habe folgendes versucht:
Zitat:
procedure TTextEditor.SetCaretY(const AValue: Integer);
begin
if fCaretY=AValue then exit;
fCaretY:=AValue;
if CaretY >=fTextBuffer.LastLine-2 then begin
fTextBuffer.FirstLine:=CaretY*fTextBuffer.LineHeight;
fTextBuffer.LastLine:=fTextBuffer.FirstLine+(fTextBuffer.LinesPerPage-2);
end;
SetupScrollBars;
Refresh;
end;

Aber leider klappt das auch nicht wie gewollt. Ich werde noch andere Möglichkeiten versuchen !

Edit01:
Ich habe doch noch deine Antwort gefunden, wo es um die Berechnung des Scroll wertes Abhändig von der Cursor Position geht. Aber leider muss ich gestehen, das ich ihn nicht ganze verstehe :( bzw. was mit anfangen könnte.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Pluto, Du bist mir ein Rätsel.

Die Berechnung dort oben - das ist doch nur eine ganz simple Rechnung. Woran liegt es, dass Du es nicht verstehst? An der Mathe oder daran, dass ich meine Variablen immer englisch benenne? Vielleicht hilft es, wenn wir diesen Beitrag einmal gemeinsam durchgehen, Stückchen für Stückchen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 15:21 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
ich glaube es liegt an den "Berechnungen" z.b. folgendes: CaretPos: ist bei mir aber in Spalten und in Zeilen und nicht in Pixeln. Bei deinem Beispiel sind die angaben in Pixeln.
Zitat:
angeklickte Zeile = CaretYPos/Zeilenhöhe = 63/25 ~ 2,52, aufgerundet 3
das bedeutet, das Caret steht in der dritten Zeile, die am Bildschirm angezeigt ist

Das verstehe ich auch nicht so ganz. Ich habe eine Varibale CaretY die speichert die Position in Zeilen.
Wenn ich die Position verändere z.b. in onKeyDown, müsste sich auch FirstLine anpassen von TextBuffer und hier habe ich meine Probleme so wie es aussieht.

_________________
MFG<br> Michael Springwald, <br>
Bitte nur Links in Deutsch, nutze überwiegend Lazarus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 24, 2008 19:40 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Ich habe eine Varibale CaretY die speichert die Position in Zeilen.

Ich verstehe. Ich bin davon ausgegangen, dass zunächst einmal eine Mausposition vorliegt, denn Du kriegst die erste Caretposition, wenn der Benutzer irgendwo auf Deinen Text klickt. Dann hast Du - aus dem Maus-Ereignis - die Information MausX/MausY, und die liegt in Pixeln vor.

Deshalb habe ich im Beispiel den Fall behandelt, die Mausposition in eine Zeilen/Spalten-Position zu "übersetzen". Das was Du oben angeführt hast, macht genau das. Immer, wenn Du einen Mausklick im Texteditor empfängst, muss so eine Umrechnung von Pixelzeilen/spalten auf Textzeilen/spalten stattfinden.

Wenn Du Tastenanschläge kriegst, hast Du es leichter, denn dann geht Deine CaretPosition einfach im Text vor oder zurück: die gespeicherte Caretposition ändert synchron ihre Spalte oder ihre Zeile mit den Tastenanschlägen (unter der Annahme, dass es Cursortasten sind). Allerdings bin ich da kein Experte, denn ich habe bisher nur ein editierbares Einzeilen-Textfeld geschrieben (eine Art TEdit), mit dem ich noch nicht ganz zufrieden bin.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 50 Beiträge ]  Gehe zu Seite Vorherige  1, 2, 3, 4  Nächste
Foren-Übersicht » Sonstiges » Meinungen zu den Projekten


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.071s | 18 Queries | GZIP : On ]