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

Aktuelle Zeit: Sa Jul 19, 2025 11:26

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 1, 2, 3, 4  Nächste
Autor Nachricht
 Betreff des Beitrags: Editor Komponenten für Lazarus
BeitragVerfasst: Mo Mai 12, 2008 12:35 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Hallo,
ich habe heute hier eine Frage gestellt:
viewtopic.php?t=7499
wegen meinem Scroll Problem.

Ich habe vor eine art RichEdit Komponente für Lazarus geschrieben, damit meine Ziele nicht zu hoch sind, habe ich leicht angefangen.
Jede Zeile ist eine TObjectList, alle Zeilen werden wiederum in einer TObjectList gespeichert.
Bei meiner Haupt Editor Projekt.

In meinem Test Projekt dient dazu eine TStringList.
ich Dachte mir dieser Thread könnte dazu dienen das Scroll Problem zu lösen, und weitere Ideen zu sammeln.

Ich habe mir die Entwicklung so vorgestellt:
Der Erste Schritt besteht dadrin eine Komponente zu erstellen die mit der Memo Komponente vergleichbar ist.
Meine Komponente soll etwas mehr können.

Im Zweiten Schritt möchte ich gerne eine Komponenten erstellen, die schon mehr Ähnlichkeit mit einer RichEdit Komponente hat.
Dort sollen z.b. die Markierten Buchstaben in einer anderen Hintergrund Farbe oder Vordergrund Farbe, oder halt in einem anderen Style z.b. Fett angezeigt werden könne.

Der Dritte Schritt ist, ich möchte gerne die Möglichkeit haben Sorucen mit meiner Komponente zu higlieten. Also sowas wie die SynEdit. Komponenten.
Damit ich nicht selbst die Sprachen zusammen tragen muss, wollte ich auf die UniSynEdit Dateien zurückgreifen, die können über 300 Speichen verstehen.

Bin ich bisherher gelangt, wollte ich noch nützliches Zubehör hinzufügen, z.b. eine einfache Wort Prüfung wie die in Firefox, die Möglichkeit ein Fertige Toolbar zu Plazieren und mit der Komponente zu verbinden. Diese Toolbar könnte z.b. einfache Anweisungen beinhalten und vom User Konfiguiert werden.

Oder auch die Möglichkeit, meine Editor Komponente in einer PageControl zu verwalten, ohne das jetzt der Programmiere der meine Komponenten nutzen möchte eine Zeile Code Schreiben muss.

Die Tasten Kombination, mit den Standard Tasten soll geändert werden können vom User, ohne das Projekt neu zu Komplieren. Dazu wollte ich eine z.b. XMl Datei erzeugen.

Ich rechne eine Entwicklung zeit von eins bis zwei Jahren, sobald ich das Scroll Problem gelöst habe.

Wie ihr sehen könnt habe ich mir viel vorgenommen. Mal sehen wie weit ich kommen werde. Ich hoffe sehr das das Scroll Problem erstmal mein größtes Problem ist, das Suchen dürfte einfacher sein(hoffe ich sehr) das ersetzten auch. Aber mal abwarten.

Was haltet ihr jetzt von meiner Bitte ?, habe ihr noch Vorschläge ? oder Ideen ?
Ich bin für alles Offen. Ich hoffe außerdem noch das meine Frage, nicht allzu ungewöhnlich ist in einem OpenGL Forum und das ihr hier eine Außname machen könntet !
Bisher habe ich hier die meisten Antworten bekommen auf meine Fragen und sogar waren davon die meisten Antwort auch zum Thema bezogen.

VIELEN DANK SCHONMAL, im Voraus.
Das Projekt, wenn es Fertig ist wird Natürlich als OpenSoruce hochgeladen. in verschiedenen Foren.


Dateianhänge:
Archiv.zip [11.32 KiB]
440-mal heruntergeladen

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


Zuletzt geändert von Pluto am Fr Mai 16, 2008 18:07, insgesamt 1-mal geändert.
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 17:13 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hallo Pluto, oder besser: Michael.
Deine Vorgangsweise ist ein wenig ... unüblich. Ich nehme jetzt mal an, dass Du hier mit Deinem Versuch ebenfalls wenig Echo haben wirst.

Um es kurz zu machen: ich habe einen größeren Teil meiner GUI bereits fertig (jedenfalls den Teil mit der ScrollBar und der ListBox) und wäre bereit, Dir zu helfen. Aber ich schreibe bestimmt keinen Sourcecode für Dich, denn das ist nicht der Zweck der Übung. Ich habe meinen Sourcecode schon einmal hier ins Forum geladen und rein grundsätzlich ist Dir dieser Soucecode daher auch zugänglich, aber ich nehme jetzt mal an, dass das kein guter Ansatzpunkt ist. Ohne Erklärung dazu nützt Dir das vermutlich nichts.

Also wird es ein Frage- und Antwortspiel werden. Du fragst - ich antworte. Manchmal kann ich nicht gleich antworten, dann musst Du eben ein wenig Geduld mit mir haben. Wir würden das hier abhandeln. Das Schlimmste, was Dir passieren kann, ist dass ich Dir sage: "Ich weiß es auch nicht." Du musst mich allerdings mit Detailinfos über Dein Projekt versorgen, denn ich weiß praktisch nichts darüber.

Willst Du das?

Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 17:53 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
OK! besser als nix! Fangen wir am besten an.

Mein Test Projekt besteht aus einer TStringList. Dort wird eine einfache Text Datei reingeladen. Die wird jetzt gezeichnet per Textout.

Meine erste frage: Wie kann ich feststellen, welche Zeilen gezeichnet werden müssen und welche nicht ?
In Meinem ersten versuch habe ich die Position beim zeichnen festgelegt und gespeichert in PY und PX.
Allerdings habe ich Probleme die Scroll Position abhängig von den Scrollbalken zu berechnen. BZW: Ich setzte die Cursor Position und es soll gescrollt werden wenn nötig. So Wie üblich.

Ich werde mir gleich mal deine "GUI" ansehen wenn ich sie finde.

Dieser Editor soll eine Komponenten von Lazarus werden, gehört also nicht zu meiner eigenen GUI. Sondern zu der von Lazarus.
Darum habe ich sie auch von TCustomControll abgeleitet.

Vielen Dank, für dein Versuch mir zu helfen. Wie gesagt ich bin für alles dankbar was du oder ihr mir geben könnt. *G*

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


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

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Tja - ich wollte Dir schreiben Du findest den Code Hier: http://www.delphigl.com/forum/viewtopic.php?t=7320&postdays=0&postorder=asc&start=15, aber es war ein Upload, der inzwischen ungültig geworden ist - es war eine öffentliche Downloadseite. Derzeit ist meine GUI grade wieder eine Baustelle weil ich alle meine Konstruktoren auf RTTI-Kompatibilität umarbeite dank dem umtriebigen Lord Horazont. :wink: Sie ist daher im Augenblick nicht kompilierbar. Aber wenn Du sie ansehen möchtest, stelle ich sie zur Verfügung.

Frage:
Zitat:
Meine erste frage: Wie kann ich feststellen, welche Zeilen gezeichnet werden müssen und welche nicht ?


Ich mache das bei mir so:

1. Ich merke mir die Nummer der obersten sichtbaren Zeile im Formular, zu Programmbeginn ist das die Zeile Null, also die Zeile Deiner Stringlist mit dem Index Null. Diese Zeile bringe ich bei JEDER Änderung (Zeilenvorschub/Seitenvorschub/Positionsänderung) auf den neuesten Stand. Als Alternative könnte man natürlich auch das linke oberste sichtbare Pixel nehmen. Damit weiß man immer, wo im Text (= wo in der StringList) man sich gerade befindet. Siehe auch die beiden anschließenden Punkte.

2. Gespeichert und auch immer auf den neuesten Stand gebracht werden muss die gesamte Höhe Deines Textes: MaxHeight = StringList.Count*LineHeight und Änderungen müssen auch der ScrollBox mitgeteilt werden

3. Vereinfachung: nur eine Schrift; ich lege eine Zeilenhöhe fest (z.B. LineHeight:= FontHeight+5), daraus ergibt sich LinesPerPage = ClientHeight Div LineHeight (die Berechnung von LinesPerPage am besten in eine Prozedur, die auch beim Form Resize aufgerufen wird), die bedruckbare Seitenbreite/Höhe könnte sich aus der Formular-ClientWidth/ClientHeight ergeben, kann man aber auch anders machen

4. Wann muss die ganze Seite neu gezeichnet werden?
*** Zu Beginn
*** nach einem Zeilen/Seitenvorschub/Positionswechsel
*** Nach einem Formular-Resize (hier ändert sich uU. die StringList, Achtung)
*** bei anderen Gelegenheiten, die mir jetzt nicht einfallen

5. Wie wird die ganze Seite gezeichnet?
Die ganze Seite, das sind die erste sichtbare Zeile (die wir ja immer wissen) + (LinesPerPage-1) Zeilen, bzw. weniger Zeilen, wenn Du im Text schon weit unten bist, das ist aber leicht zu überprüfen

6. Wenn der Benutzer eine Zeile editiert, muss eigentlich nicht immer die gesamte Seite neu gezeichnet werden, sondern immer nur der Bereich, der geändert wird. Das kann natürlich ausarten, wenn der Benutzer Text einfügt, dann muss der ganze Text bis zum Seitenende weitergeschoben werden, dauernder Wordwrap etc.

Ist damit die Frage beantwortet?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 19:58 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Zitat:
2. Gespeichert und auch immer auf den neuesten Stand gebracht werden muss die gesamte Höhe Deines Textes: MaxHeight = StringList.Count*LineHeight und Änderungen müssen auch der ScrollBox mitgeteilt werden

Das Geht doch bestimmt nur wenn die Zeilen alle gleich groß sind oder ? Aber was ist wenn die Zeilen unterschiedlich groß sind ?

Punkt 3: verstehe ich überhaupt nicht. Könntest du mir das etwas ausführlicher beschreiben ?
Punkt 4: ist klar.
Punkt 5: ist mir auch klar.
Punkt 6: dürfte mir auch klar sein, genau so hatte ich das in meinem Haupt Projekt auch gemacht.

Zitat:
Ist damit die Frage beantwortet?

Teilweise. einige Punkte sind mir halt noch unklar. besonders die Formelen.

Damit sich die Antworten auch lohnen gleich meine zweite Frage:
(Die eigentlich auch mit der ersten zusammenhängt)
Der User Springt jetzt zu einer bestimmten Zeile. Da muss hingescrollt werden. Ist das Punkt 2 ?
und gleich noch eine weitere: Der User drückt die Pfeiltasten und der Cursor ist am Bildschrim rand.
Dann müsste das doch auch gescrollt werden, sobald die Cursor Position gesetzt wird oder ? und zwar um eine Zeile.
Wenn der User jetzt mehrere Zeilen auf einmal scrollen möchte z.b. eine ganze Bildschrim seite könnte ich ja diesen wert entsprechend anpassen. und wider zurück setzten.

Erstmal vielen Dank für dein Versuch mir zu helfen. Das haben schon viele versucht in diesen Bereich. Ich hoffe sehr das ich das Scroll Prinzip verstehe.
Weil eine ListBox könnte ich dann genauso erstellen und mit einer Scroll Funktion ausbauen.
Aber mir geht es erstmal um eine Editor Komponente für Lazarus.

Die TStringlist wird sowieso später durch was anders ersetzt bzw. evlt. mache ich auch das Projekt gar nicht weiter sondern baue die Scroll Funktion sobald sie Funktioniert in meinem eigentlichen Editor Projekt. mal sehen.

Achja noch was: Ich zeichne nur zuviel wie gerade auf den Bildschrim Passt. Der interne Buffer das eine TBitmap ist, wird dann Automatisch angepasst.
Ich möchte auch gerne die Möglichkeit haben unterschiedlich große Buchstaben zu verarbeiten und sowas.
Aber ich denke erstmal reicht das wenn wir es einfach angehen.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Mai 13, 2008 21:34 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Das Geht doch bestimmt nur wenn die Zeilen alle gleich groß sind oder ? Aber was ist wenn die Zeilen unterschiedlich groß sind ?

Verschiedene Schriften => unterschiedlich große Zeilen => einzige Möglichkeit, die mir einfällt: ein dynamisches IntegerArray (Oder eine Liste) mit den Zeilenhöhen anlegen, es sei denn, Dir fällt was Besseres ein.

Betrifft Punkt 3 (Alle Angaben in Pixel):
-----------------
*** Annahme1 (soll heißen, das kannst Du so festlegen, kannst aber genausogut was anderes festlegen; wenn die Seitenbreite immer die Zeilenbreite ist, braucht man z.B. keine horizontale ScrollBar)
Seitenbreite = TForm.ClientWidth
Seitenhöhe = TForm.ClientHeight

*** Annahme2: (dabei bist Du zumindest an die größte Font, die sich in dieser Zeile befindet, gebunden, ist also nicht ganz frei wählbar)
ZeilenHöhe = Maximale Schrifthöhe+Zeilenzwischenraum
Wieviel Zeilenzwischenraum Du nimmst, ist Geschmackssache


Die Formeln sind nix Kompliziertes:

Ich habe eine Zeilenhöhe und eine Seitenhöhe festgelegt, siehe oben meine beiden Annahmen. Unter der vereinfachenden Annahme einer einzigen Schrift kann ich damit die Zeilen pro Seite festlegen:

ZeilenProSeite:= SeitenHöhe Div Zeilenhöhe (Seitenhöhe dividiert durch Zeilenhöhe, alles in Pixel)

Bei verschiedenen Zeilenhöhen bleibt Dir nichts anderes übrig, als pro Seite die Anzahl der Zeilen individuell zu berechnen. Ist ein hartes Los, das Programmieren eines RichEdit Memo. Der Wert ZeilenProSeite wird unbedingt für das Drucken der gesamten Seite gebraucht.

Zitat:
Der User Springt jetzt zu einer bestimmten Zeile. Da muss hingescrollt werden. Ist das Punkt 2 ?

GANZ GENAU. Die Gesamthöhe des Textes in Pixel musst Du immer Deiner Vertikalen ScrollBox mitteilen, gleich zu Beginn und auch immer, wenn sie sich ändert. Zu Beginn hat die ScrollBox die Position Null. Wenn der Benutzer auf eine Seite klickt, errechnest Du die Position, die Du jetzt in die ScrollBox füttern musst, so:

(Ich benutze hier wieder die Annahme, dass wir nur eine Schrift haben)
VerticalScrollBox.Position:= ErsteSichtbareZeile*ZeilenHöhe + MausPosition.Y

Beispiel: die erste sichtbare Zeile ist die StringList-Zeile mit dem Index 5
VerticalScrollBox.Position:= 5*ZeilenHöhe + MausPosition.Y

wobei "5*Zeilenhöhe" die Zeilen Null bis 4 repräsentieren, die "weiter oben" also nicht sichtbar sind, und dazuzählen müssen wir bloß noch den Y-Mauswert. Wenn das Ergebnis dieser Rechnung an die ScrollBox weitergibst, sollte sie die richtige Position einnehmen.

Zitat:
und gleich noch eine weitere: Der User drückt die Pfeiltasten und der Cursor ist am Bildschrim rand.
Dann müsste das doch auch gescrollt werden, sobald die Cursor Position gesetzt wird oder ? und zwar um eine Zeile.


Da bin ich jetzt ein wenig unsicher. Eigentlich sollte der Scrollbalken dann automatisch seine richtige Position einnehmen.

Und Du musst nichts umstellen. Das übliche Verhalten der Scrollbox ist so, dass bei Anklicken der Knöpfe eine "kleine definierte Positionsänderung", bei anklicken der Scrollbarfläche selbst eine "große definierte Positionsänderung" mitgeteilt wird (Informationsfluss = ScrollBox=>Memo). Das Verschieben des ScrollBar-Balkens ist die dritte Möglichkeit, eine Positionsänderung vorzunehmen. Man sollte sie gleich zu Programmbeginn intialisieren, aber sie können auch nachträglich geändert werden, eben in dem Fall, wenn Dein Text kürzer/länger wird (= die Anzahl der Strings in der Liste verändert sich).

Ich habe gerade nachgesehen, in Delphi heißen die entsprechenden Eigenschaften der ScrollBar "LargeChange","SmallChange" und "Position". Ich nehme an, dass sie in Lazarus gleich heißen. Was Du mit den beiden Werten dann anstelltst, kannst Du selbst entscheiden. Für Text bietet sich natürlich an, den kleinen Wert als Zeile anzunehmen und den großen als Seite. Aber wenn Du verschiedenen Zeilenhöhen hast, kannst Du Dich z.B. für eine durchschnittliche Zeilenhöhe entscheiden.

Traude


NACHTRAG: Das hab ich Dir noch unterschlagen, Auszug Aus der Delphi7-Hilfe betreffend die ScrollBox:
Zitat:
Mit Max können Sie den maximalen Wert der Eigenschaft Position festlegen. Die Eigenschaften Max und Min definieren den Bereich für Position.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 11:30 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Ich wollte keine Scrollbox nutzen sondern zwei Scrollbalken. Die Scrollbox hat für mich zu viele Nachteile im nachhinein.

Soweit so gut, jetzt eine neue Frage: Wie kann ich die Höhe/Breite der Scrollbalken berechnen. Da ich ja keine Scrollbox nutze:
Wenn ich unter Linux mit der Maus den Scrollbalken bewege Flimmert es, egal ob ich den Text Buffer oder nicht. Daher wollte ich zwei TScrollbar's nehmen. Aber das dürfte egal sein oder ?

Zitat:
Verschiedene Schriften => unterschiedlich große Zeilen => einzige Möglichkeit, die mir einfällt: ein dynamisches IntegerArray (Oder eine Liste) mit den Zeilenhöhen anlegen, es sei denn, Dir fällt was Besseres ein.

Naja, wenn das so ist, könnte ich auch die Object Eigenschaft der TStringList erstmal dazu nutzen und mir eine eigene Klasse schreiben die z.b. unteranderem die Höhe der jeweiligen Zeilen festhält.

Was mir jetzt noch unklar ist: Es wird gescrollt, also wird der Text entsprechend Angepasst. Folgende Variablen habe ich in meinem Editor hinzugefügt:
Code:
  1.  
  2.     FScrollMaxX: Integer;
  3.     FScrollMaxY: Integer;
  4.     FScrollPagX: Integer;
  5.     FScrollPagY: Integer;
  6.     FScrollPosX: Integer;
  7.     FScrollPosY: Integer;
  8.  


Und noch einige Proceduren. Die Frage ist jetzt natürlich das sich auch die Scrollbalken anpassen, sonst nützt mir das ganze nix.

Aus dem Lazarus Forum hat mir jemand diese Procedure geben und ich habe sie entsprechend angepasst.
UpdateScrollBars wird letztendlich immer beim Scrollen aufgerufen, bzw. wenn die Scrollbalken gesetzt werden.
Code:
  1.  
  2. procedure TPlutoEditor.UpdateScrollBars;
  3. var
  4.   S: TScrollInfo;
  5. begin
  6.   FScrollPagX := ClientWidth div 5;
  7.   FScrollPagY := ClientHeight div 5;
  8.   if (HandleAllocated) then begin
  9.     if (FScrollBars in [ssHorizontal, ssBoth]) then begin
  10.         S.cbSize := SizeOf(S);
  11.         S.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
  12.         S.nPos := FScrollPosX;
  13.         S.nMin := 0;
  14.         S.nMax := FScrollMaxX;
  15.         if (FScrollPagX > 0) then
  16.           inc(S.nMax, FScrollPagX - 1);
  17.         S.nPage := FScrollPagX;
  18.         SetScrollInfo(Handle, SB_HORZ, S, true);
  19.     end;
  20.  
  21.     if (FScrollBars in [ssVertical, ssBoth]) then begin
  22.         S.cbSize := SizeOf(S);
  23.         S.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL;
  24.         S.nPos := FScrollPosY;
  25.         S.nMin := 0;
  26.         S.nMax := FScrollMaxY;
  27.         if (FScrollPagY > 0) then
  28.           inc(S.nMax, FScrollPagY - 1);
  29.         S.nPage := FScrollPagY;
  30.         SetScrollInfo(Handle, SB_Vert, S, true);
  31.     end;
  32.   end
  33.   //else
  34. //    writeln('OK');
  35. end;
  36.  


Im Moment kann ich mir aus deinen "Antworten" noch keinen "Code" vorstellen. Aber nochmal vielen Dank für deine Hilfe. Wenn du lust hast können wir das ja so lange fortführen bis ich es verstanden habe. Weil das währe so toll. Das Scrollen ist im Moment meine letzte größere Hürde bei meiner GUI und bei meinen Komponenten.

PS: Ich habe einen Beitrag von dir gefunden, wo du unsichere wahres das du deine GUI weiter entwickeln solltest. Schön das du es gemacht hast. So eine eigene GUI bringt viele Vorteile mit sich, finde ich.

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


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

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Entschuldigung, war ein Verschreiber gestern ich meine nicht ScrollBox sondern Scrollbar.

Zitat:
Wenn ich unter Linux mit der Maus den Scrollbalken bewege Flimmert es, egal ob ich den Text Buffer oder nicht. Daher wollte ich zwei TScrollbar's nehmen. Aber das dürfte egal sein oder ?

Das Flimmern hat nichts damit zu tun, wieviele ScrollBars Du nimmst. Beim Scrollbalken verschieben muss dauernd gezeichnet werden, aber es sollte dabei nicht flimmern.

Jetzt muss ich aber ein paar Gegenfragen stellen:

1. Aus welcher Komponente ist TPlutoEditor abgeleitet?

2. Wird die Struktur von TScrollInfo unten gänzlich angegeben und befüllt oder fehlt da noch etwas? (TScrollInfo sagt mir nämlich nichts, eine Dokumentaiton dazu wäre nicht schlecht).

3. Deine Variablen interpretiere ich so
FScrollMaxX/Y = Maximale Textbreite/höhe
fScrollPosX/Y = Die aktuelle Position (X/Y), die er im Text gerade hat
FScrollPagX/Y = Scrollbreite/Höhe = wieviel er weiterscrollen soll

4. Ich kommentiere aus der Prozedur "UpdateScrollBars", die Wertzuweisungen für die horizontale Scrollbar:

HINWEIS: ich interpretiere diese Prozedur ihrem Namen nach nicht als Initialisierung (das nur einmal bzw. selten passieren sollte), sondern als Update, was im Programm sehr oft vorkommt


S.cbSize := SizeOf(S); // Hier wird offenbar die Größe der Struktur angegeben (warum? Wenn das ein Parameter ist, der an die Scrollbar übergeben wird, sollte er da in seiner Größe nicht feststehen?)

S.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL; // Interpretiere ich mal als die Events, die mitgeteilt werden sollen, flagartig aufgebaut (sollte hier, wenn Du die Position angeben willst, nicht bloß "SIF_POS" stehen?)

S.nPos := FScrollPosY; // Du teilst die aktuelle Position deiner ScrollBar mit, OK (Nicht vergessen: hier müssen auch die nicht sichtbaren Bereiche dabei sein, die Mausposition allein genügt nicht)

S.nMin := 0; // Das würde ich definitiv nicht in einer Update-, sondern nur in einer Initialisierungsprozedur machen: das ist doch offenbar der Beginn deiner Gesamtrange

S.nMax := FScrollMaxY; // hier gilt das gleiche wie in der vorigen Zeile

if (FScrollPagY > 0) then
inc(S.nMax, FScrollPagY - 1); // Das verstehe ich nicht: warum vergrößerst Du hier Deinen maximalen
Bereich um den ScrollBereich? Das würdest Du dann nämlich bei jeder Positionsänderung machen. Oder verstehe ich das falsch?

S.nPage := FScrollPagY; // auch das gehört in eine Initailiserung, nicht in ein Update ist aber grundsätzlich OK

SetScrollInfo(Handle, SB_Vert, S, true); // Übergabe der Info an die ScrollBar, OK




FAZIT: Der Zweck der Anweisung
f (FScrollPagY > 0) then
inc(S.nMax, FScrollPagY - 1);
ist mir nicht klar. Zur Steuerung einer ScrollBar in Lazarus müßte es doch eine Dokumentation geben?


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

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Zitat:
1. Aus welcher Komponente ist TPlutoEditor abgeleitet?

Im Moment von TCustumControll

Zitat:
2. Wird die Struktur von TScrollInfo unten gänzlich angegeben und befüllt oder fehlt da noch etwas? (TScrollInfo sagt mir nämlich nichts, eine Dokumentaiton dazu wäre nicht schlecht).

Eine Dokumeation kann ich dir nicht geben, aber ein Link, wo ich das her habe:
http://www.lazarusforum.de/viewtopic.ph ... c&start=15

Zitat:
3. Deine Variablen interpretiere ich so

Die Stamen nicht von mir, aber ich denke genauso drüber wie du.

Zitat:
HINWEIS: ich interpretiere diese Prozedur ihrem Namen nach nicht als Initialisierung (das nur einmal bzw. selten passieren sollte), sondern als Update, was im Programm sehr oft vorkommt

Das ist genau richtig. Diese Variable werden bei Create einmal alle auf 0 gesetzt.

Zitat:
S.cbSize := SizeOf(S); // Hier wird offenbar die Größe der Struktur angegeben (warum? Wenn das ein Parameter ist, der an die Scrollbar übergeben wird, sollte er da in seiner Größe nicht feststehen?)

Da bin ich mir jetzt nicht sicher da der Code nicht von mir stammt.Ich denke das braucht das entsprechende Toolkit was ich nutze also GTK1.

Zitat:
S.fMask := SIF_POS or SIF_RANGE or SIF_PAGE or SIF_DISABLENOSCROLL; // Interpretiere ich mal als die Events, die mitgeteilt werden sollen, flagartig aufgebaut (sollte hier, wenn Du die Position angeben willst, nicht bloß "SIF_POS" stehen?)

Wenn ich soweit bin müsste ich das mal testen.

Zitat:
S.nPos := FScrollPosY; // Du teilst die aktuelle Position deiner ScrollBar mit, OK (Nicht vergessen: hier müssen auch die nicht sichtbaren Bereiche dabei sein, die Mausposition allein genügt nicht)

Wie meinst du das jetzt ? Genau das ist einer meiner Problemzonen :(

Zitat:
S.nMin := 0; // Das würde ich definitiv nicht in einer Update-, sondern nur in einer Initialisierungsprozedur machen: das ist doch offenbar der Beginn deiner Gesamtrange

Ich glaube hier liegst du Falsch, denn nMin ist das Minimum, der Scrollbalken wo hingescrollt werden kann, das ist 0. Das kann also ruhig immer Passieren.
Da ja S: TScrollInfo; eine Locale Variable ist und keine Goable muss das sogar immer Passieren.

Zitat:
S.nMax := FScrollMaxY; // hier gilt das gleiche wie in der vorigen Zeile

Nicht umbedinkt, was ist wenn sich fScrollmax ändern ?
Code:
  1.  
  2. if (FScrollPagY > 0) then
  3. inc(S.nMax, FScrollPagY - 1); // Das verstehe ich nicht: warum vergrößerst Du hier Deinen maximalen
  4. Bereich um den ScrollBereich? Das würdest Du dann nämlich bei jeder Positionsänderung machen. Oder verstehe ich das falsch?

Eine Gute Frage.
Code:
  1.  
  2. S.nPage := FScrollPagY; // auch das gehört in eine Initailiserung, nicht in ein Update ist aber grundsätzlich OK
  3.  
  4. SetScrollInfo(Handle, SB_Vert, S, true); // Übergabe der Info an die ScrollBar, OK


Im Prinzip hast du recht, aber s ist ja eine Local Variable und keine Gobale, dann müsste ich das ändern.

Zitat:
ist mir nicht klar. Zur Steuerung einer ScrollBar in Lazarus müßte es doch eine Dokumentation geben

Ich habe noch keine hilfreiche gefunden.

Meinst du ich sollte alles was mit den Scroll sachen zu tun hat wieder löschen und einfach zwei Scrollbalken Definieren ?
Das währe wohl das einfachste. Allerdings müsste ich sie dann auch richtig ausrichten und so.

Mein Problem ist jetzt der Anfang. Wie kann ich jetzt anfangen das Scrollen einzubauen ? Neu Anfangen mit dem Scrollbereich oder versuchen den Alten zu überarbeiten ?

Du sagst ja das ich in jeder Zeile die Höhe haben muss. Gut, das ist kein Problem im Moment.
Dann müsste ich beim zeichnen die Zeilen rauß sortieren die ich nicht brauche und nur die zeichnen die sich im Sichtbereich befinden also zwischen FirstLine und lastLine liegen.
Die Frage währe jetzt noch wie ermittele ich diese werte ? Schön währe das ja wenn ich das nur beim Scrollen machen könnte und nicht immer beim Zeichnen.

Nochmals Vielen Dank für deine Hilfe. So ein Forum ist recht Praktisch, evlt. haben ja auch noch andere was davon.

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


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

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Zitat:
Meinst du ich sollte alles was mit den Scroll sachen zu tun hat wieder löschen und einfach zwei Scrollbalken Definieren ?

NEIN, auf gar keinen Fall. Scrollbalken sind da, um benutzt zu werden. Es hat keinen Sinn, einfach aufzugeben. Wir sind genau dort, am wunden Punkt.

Ich gehe mal auf die Suche wegen einer Doku zur Lazarus ScrollBar. Drüben bei den Amis gibts bestimmt was. Es kann ein bisschen dauern.
Bis dann,
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 16:34 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Was ist dir denn unklar bei den Scrollbalken ? Mir sind eigentlich die Parameter klar.
Min, max, pagesize.

Wie hast du denn das bei dir gemacht ? mit eine eigenen Scrollbalken Komponente ?

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Da bin ich wieder aus dem Netz zurück.

Ja ich habe meine eigenen ScrollBars programmiert. Ich habe das so gemacht: ich fordere von Windows nur ein nacktes Fenster an, auch ohne Balken, einfach nur ein Viereck. Alles andere zeichne ich selbst.

Und ich lach mich schief, denn was ich gefunden habe, damit hab ich gar nicht gerechnet. Du arbeitest doch mit Linux, nicht war? Ich war jetzt eine Weile im Netz unterwegs und habe mit den Stichwörtern Lazarus+TScrollbar nichts Griffiges gefunden. Das brauchen sie auch gar nicht. Denn ich habe sogar eine großartige Doku gefunden in meiner Delphi7-Hilfe zum Windows-SDK. Die Struktur TScrollInfo ist eine Windows-Struktur.

Es sieht also so aus als ob diese Dinge SEHR an Windows angelehnt wären. Aber Achtung! wir haben keine Gewähr dafür, dass sie intern wirklich so implementiert sind.

Ich hänge trotzdem mal hier ein Zip-File mit folgendem Inhalt rein:

drei Rich-Text-Files mit jeweils der Windows-Doku zum
* Struct ScrollInfo
* Routine GetScrollInfo
* Routine SetScrollInfo

Sind aber leider Englisch. Wenn Du Probleme mit dem Verstehen hast, helfe ich Dir gern.

Und dazu gibts jetzt natürlich noch einen wirklich tollen Link aus Deinem eigenen Forum, nämlich dieser hier: http://www.catch22.net/tuts/editor03.asp. Dieser ist natürlich auch in Englisch. Aber das macht nichts. Ich habe keine Schwierigkeiten damit, ihn zu lesen. Wir haben jetzt wenigstens ordentlich Dokumentation zu der ScrollBar.


Dateianhänge:
ScrollBarInfo.zip [3.45 KiB]
402-mal heruntergeladen
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Erstmal wieder ein ganz großes Dankeschön. Den Link kenne ich schon, leider nützt er mir wenig, wenn er dir weiter Hilft ist das auch schon nicht schlecht. Evlt. bekommen wir beide das Problem ja in den griff. Wer weiß. Ich schau mir gleich mal die Dateien an.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 18:29 
Offline
DGL Member
Benutzeravatar

Registriert: Di Okt 03, 2006 14:07
Beiträge: 1277
Wohnort: Wien
Hör mal, Michael,
Ich übersetze heute diesen Text für Dich. Schließlich habe ich von diesem kleinen Intermezzo auch meinen Vorteil: irgendwann wird es für mich auch soweit sein, Textfiles darstellen zu müssen. Dann werde ich wahrscheinlich sehr froh sein, schon ein bisschen Erfahrung gesammelt zu haben. Allerdings schüttelts mich richtig beim Gedanken an Textprogrammierung. Grafikprogrammierung ist viel netter.

Den Text kann ich vom Blatt runter übersetzen und ich kann auch ziemlich schnell tippen. Ich werde nicht das ganze Dokument übersetzen sondern nur die Stellen, die wirklich die wichtigen Dinge beschreiben - er schwafelt am Anfang ein bisschen. Das Kapitel "Configuring the scrollbars" hab ich schon :wink:

Vielleicht wirds noch heute Abend fertig, spätestens aber morgen mittag. Dann bist Du voll im Bilde, das ist eine wirklich gute Beschreibung. Herumraten ist reine Zeitverschwendung, finde ich.
Viele Grüße
Traude


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 14, 2008 19:55 
Offline
DGL Member
Benutzeravatar

Registriert: So Mai 11, 2003 10:36
Beiträge: 285
Wohnort: Oldenburg
Programmiersprache: Object Pascal
Zitat:
Textprogrammierung. Grafikprogrammierung ist viel netter.

Da Stimme ich dir voll und ganz zu. Aber die Grafikprogrammierung muss einfach sein. kein aufwendiges 3D *G*

Zitat:
Ich übersetze heute diesen Text für Dich.

DAS WÄHRE GANZ TOLL. Ich schon selbst überlegt den zu übersetzten, nur würde das bei mir zu lange dauern da ich kein Englisch kann.
Evlt. könntest du den dann als PDF hier ins Forum stellen.

Zitat:
die wirklich die wichtigen Dinge beschreiben

Die dürften auch ausreichen, den Rest könnten wir dann nach und nach übersetzten.

Zitat:
Vielleicht wirds noch heute Abend fertig,

So schnell ? Warnsin. Evlt. sollte ich dir dann eine Postkarte schicken *G* als kleine geste oder sowas.

Zitat:
Dann bist Du voll im Bilde, das ist eine wirklich gute Beschreibung

Ja, ich habe versucht etwas zu lesen, aber nach einigen Zeilen habe ich dann wieder aufgehört.

Du Programmierst doch deine GUI für OpenGL oder ? Wie hast du die eingeteilt ? evlt. könnte ich dir etwas dabei helfen ? Aber darüber könnten wir in einem anderen Thread sprechen.

Ich freue mich schon auf deine Übersetzung. Ich hoffe nur das sie dann wirklich hilfreich ist. ich meine das war doch für C++ oder ? aber das macht auch nix.
Nochmals vielen Dank für deine Großartige Hilfe.

Ich bin froh wenn ich das hinter mir habe.

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


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 1, 2, 3, 4  Nächste
Foren-Übersicht » Sonstiges » Meinungen zu den Projekten


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 11 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 16 Queries | GZIP : On ]