![]() |
aktuelle Zeile in SynEdit einfärben
Hallo Wissende,
ich habe in diesem Forum schon gute hilfe gefunden und hoffe nun darauf auch diesmal dies erfahren zu dürfen, was mich interessiert. Ich habe einen CSS-Editor programmiert (Freeware) und möchte nun, dass der User genau sieht, wo er gerade ist. Es soll so sein, dass wenn der User aktuell in der 3 Zeile seinen Curosr hat, soll die z.B. gelb sein und der Rest normal weiss. Verlässt er diese Zeile, soll diese wieder weiss werden und die nun aktuelle Zeile soll die Farbe gelb erhalten. Das wäre es schon. Schön wäre es, wenn man der Zeile auch einen gestrichelten Rahmen geben könnte. Das muss aber nicht sein, wäre nur ein toller Zusatz. folgender Link hat mir nicht geholfen: ![]() da er nur die aktuelle Zeile einfärbt aber nicht erklärt, wie man dies wieder aufhebt und statt dessen die nächste Zeile auch noch einfärbt. Wer kann mir helfen ? Danke Tom |
Da schließ ich mich doch glatt mal an... ;)
Chris PS: Nur um die Antworten mitzubekommen... ;) :roll: |
Moin Tom,
OnSpecialLineColors wird beim Zeichnen jeder Zeile aufgerufen. Jetzt musst Du nur noch einen Filter in die Funktion einbauen, der, je nach Zeilennummer die gerade dran ist (die Zählung fängt bei 1 an), die Farben setzt, oder eben auch nicht. Beispiel: Ich habe 3 Zeilen, und die sollen "hübsch bunt" ;-) werden:
Delphi-Quellcode:
procedure TfrmMAIN.SynEdit1SpecialLineColors(Sender: TObject;
Line: Integer; var Special: Boolean; var FG, BG: TColor); begin Special := true; case Line of 1 : begin FG := clBlue; BG := clYellow; end; 2 : begin FG := clRed; BG := clBlack; end; 3 : begin FG := clGray; BG := clPurple; end; end; end; |
Ich fress ´n Besen
Moin Christian,
sollte das funzen, fress ich´n Besen. Ich habe diese Procedure schon in ähnlicher Weise benutzt, ohne halt auszuwerten, wo bin ich. Es müsste also reichen das CaretX abzufragen und dann die Zuweisung zu machen. Hast Du einen Plan, wo man(n) noch "deutsche" Hilfe für Newbies zum Thema SynEdit finden kann ? Danke Tom |
Moin Tom,
ich wüsste zu SynEdit im Moment leider gar keine Hilfe, geschweige denn eine deutschsprachige, bzw. für Newbies in SynEdit. Das Beispiel hab' ich schon ausprobiert, es funzt. Da ich mich mit SynEdit ansonsten kaum auskenne hab' ich mich auch davor "gedrückt" herauszufinden, welche Zeile die aktuelle ist. CaretPos.X wie bei RichEdit konnte ich nämlich nicht finden ;-) Wenn Du dafür eine Lösung hast: Immer her damit. |
Ich hab grad kein Delphi da...aber vielleicht gibts ja sone art "Lines.index" oder in der Richtung... Viel Glück noch bei der Suche.
|
Nicht ganz des Rätsels Lösung
Folgendes habe ich nun bei mir getan, um dem, was ich will nahe zu kommen:
Delphi-Quellcode:
Es funktionier solange gut, wie ich nur die Entertaste und Backspace zum Einsatz bringe. Sobald ich aber per Mouse, oder Pfeil hoch und runter die aktuelle Zeile Verlasse, wird sie nicht neu gezeichnet und somit gibts auch nicht den Effekt, wie ich ihn gern hätte.
procedure TfrmMAIN.SynEdit1SpecialLineColors(Sender: TObject;
Line: Integer; var Special: Boolean; var FG, BG: TColor); var i:integer; begin Special := true; for i:= 1 to SynEdit1.Lines.Count -1 do begin if Line = SynEdit1.CaretY then begin bg:=clgreen; end else begin gb:=clwhite; end; end; end; Wie komme ich nun endgültig zum Ziel? Nochmals vielen Dank für die Unterstützung. Tom |
Moin Tom,
beim Klicken ginge es so:
Delphi-Quellcode:
Nur mit dem Bewegen per Taste hab' ich noch keine Lösung.
procedure TfrmMAIN.SynEdit1SpecialLineColors(Sender: TObject;Line: Integer; var Special: Boolean; var FG, BG: TColor);
begin if Line = SynEdit1.CaretY then begin Special := true; bg :=clGreen; end; end; procedure TfrmMAIN.SynEdit1Click(Sender: TObject); begin SynEdit1.Refresh; end; |
Moin Chris,
Hm, also werde ich es erst einmal so probieren, wie Du es geschrieben hast. Gibt es denn nicht einfach die Möglichkeit herauszufinden, ob eine der vier Pfeiltasten gedrückt worden ist? Das könnte man doch in OnKeyDown reinnehmen und dann sagen:
Delphi-Quellcode:
So weit so gut. Nun habe ich das gleich mal getestet und festellen müssen, dass die Markierung der aktuellen Zeile immer um eins "nachhängt". Das heisst, dass der Cursor zwar schon von der letzten Zeile 5 auf die 4. gesprungen ist, aber noch nicht die 4. Zeile markiert worden ist. Gehe ich nun in die 3. Zeile springt die Markierung in die 4te. usw. Dabei habe ich auch gleich noch bemerken dürfen, dass natürlich dementsprechend auch meine Anzeige in der Statusleiste "hinkt".
procedure TForm1.SynEdit1KeyDown(Sender: TObject; var Key: Word; Shift:TShiftstate);
var x,y:integer; begin X:=SynEdit1.CaretX; Y:=SynEdit1.CaretY; Statusbar1.Panels.Items[0].Text:=inttostr(Y)+':'+inttostr(x); if (Key = vk_Down) or (Key = vk_up) then SynEdit1.Referesh Abhilfe? Gegenvorschläge? Tom [EDIT=Luckie]Code-Tags gefixt.[/EDIT] |
Moin Tom,
ich denke ich hab's
Delphi-Quellcode:
var
iOffset : integer; // globale Variable procedure TfrmMAIN.SynEdit1SpecialLineColors(Sender: TObject; Line: Integer; var Special: Boolean; var FG, BG: TColor); begin if (Line = (SynEdit1.CaretY+iOffset)) then begin Special := true; bg :=clGreen; end; end; procedure TfrmMAIN.SynEdit1Click(Sender: TObject); begin SynEdit1.Refresh; end; procedure TfrmMAIN.SynEdit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if Key = VK_DOWN then iOffset := 1; if (Key = VK_UP) then iOffset := -1; if ((SynEdit1.CaretY = 1) and (iOffset = -1)) or ((SynEdit1.CaretY = SynEdit1.Lines.Count) and (iOffset = 1)) then iOffset := 0; SynEdit1.Refresh; end; |
Danke, sowas hab ich auch noch gesucht! :thumb:
|
Leider, leider war es das noch nicht ganz. Ich würde ja selbst weiter dran rumdoktoren, aber ich weiss nicht genau, wie ich auf dieses Phenomän reagieren soll.
Deine Vorlage läuft besser als mein letzter Ansatz, aber leider noch nicht perfekt. Folgendes passiert: Ich erhöhe die zeilenzahlen durch Enter. Alles OK. Ich gehe zurück mit Backspace. Alles OK. Ich drücke einmal die Pfeiltaste nach oben. Alles OK. Ich drücke einmal die Pfeiltaste nach rechts. Der Cursor bleibt in der Zeile, so wie es sein soll aber die Markierung springt eine Zeile höher. Ähnliches passiert, wenn ich die Pfeiltaste nach links drücke: Der Curosor bleibt in der Zeiles aber es wird eine Zeile tiefer markiert. Woran kann das nun wieder liegen? Chris ich danke Dir für Deine bisher geleistete Arbeit und bitte Dich nun letztmalig -)) um Deine Hilfe. Danke Tom |
Moin Tom,
ich hatte so etwas geahnt. Das Problem ist, dass iOffset nicht wieder zurückgesetzt wird. Die dritte Zeile im OnKeyDown muss so aussehen:
Delphi-Quellcode:
Jetzt wird der Offset auch dann immer zurückgesetzt, wenn kein VK_DOWN oder VK_UP gedrückt wurde.
if ((SynEdit1.CaretY = 1) and (iOffset = -1)) or ((SynEdit1.CaretY = SynEdit1.Lines.Count) and (iOffset = 1)) or (not (Key in [VK_DOWN,VK_UP])) then iOffset := 0;
|
O sole mio.
Warum komme ich nicht auf so simple Ideen ein Problem zu lösen!? Ich danke Dir und hoffe auf meine Lernfähigkeit. Tom |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz