![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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