Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi aktuelle Zeile in SynEdit einfärben (https://www.delphipraxis.net/5245-aktuelle-zeile-synedit-einfaerben.html)

torud 29. Mai 2003 14:02


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:
http://www.geocrawler.com/archives/3.../10/0/4572020/ ,
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

CalganX 29. Mai 2003 14:17

Da schließ ich mich doch glatt mal an... ;)

Chris

PS: Nur um die Antworten mitzubekommen... ;) :roll:

Christian Seehase 29. Mai 2003 15:41

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;

torud 29. Mai 2003 20:41

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

Christian Seehase 29. Mai 2003 20:50

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.

Stanlay Hanks 29. Mai 2003 20:54

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.

torud 29. Mai 2003 20:59

Nicht ganz des Rätsels Lösung
 
Folgendes habe ich nun bei mir getan, um dem, was ich will nahe zu kommen:
Delphi-Quellcode:
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;
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.

Wie komme ich nun endgültig zum Ziel?
Nochmals vielen Dank für die Unterstützung.

Tom

Christian Seehase 29. Mai 2003 21:15

Moin Tom,

beim Klicken ginge es so:

Delphi-Quellcode:
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;
Nur mit dem Bewegen per Taste hab' ich noch keine Lösung.

torud 30. Mai 2003 11:05

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:
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
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".

Abhilfe?
Gegenvorschläge?
Tom
[EDIT=Luckie]Code-Tags gefixt.[/EDIT]

Christian Seehase 30. Mai 2003 13:49

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:29 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz