Zwischen 2 SynEdit Zeilen kopieren

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Robologe
Beiträge: 20
Registriert: Di 2. Mai 2017, 13:00

Zwischen 2 SynEdit Zeilen kopieren

Beitrag von Robologe »

Habe 2 SynEdits und möchte diese laufend vergleichen ist ein Unterschied soll die Statusleiste von grün auf rot wechseln die Zeilennummer und Position ausgegeben werden;
Ich habe da so Probleme wie Wie kann ich die aktuelle Länge des SynEdit.Lines abfragen (Zeilenanzahl)

Vielleicht hat jemand so Beispiele in seiner Ablage
Danke !!
Win 7 FPC 3.2.0 Laz 2.0.12

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von theo »

Robologe hat geschrieben:Ich habe da so Probleme wie Wie kann ich die aktuelle Länge des SynEdit.Lines abfragen (Zeilenanzahl)


Code: Alles auswählen

SynEdit1.Lines.Count;

Robologe
Beiträge: 20
Registriert: Di 2. Mai 2017, 13:00

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von Robologe »

Danke für die Info
Es steht schon wieder die nächste Frage an
Wie kann ich von zwei Synedit Fenster ; wenn ich im linken nach unten scrolle das zweite mitscrollen lassen
Win 7 FPC 3.2.0 Laz 2.0.12

Robologe
Beiträge: 20
Registriert: Di 2. Mai 2017, 13:00

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von Robologe »

Danke für die Info
Es steht schon wieder die nächste Frage an
Wie kann ich von zwei Synedit Fenster ; wenn ich im linken nach unten scrolle das zweite mitscrollen lassen
Win 7 FPC 3.2.0 Laz 2.0.12

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von theo »

Abgleichen kann man sie so:

Code: Alles auswählen

Synedit2.TopLine:=Synedit1.TopLine;


Das Problem ist, das Scroll Event mitzukriegen. Ich würde vllt. der Einfachheit halber einen TTimer dafür nehmen.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von Michl »

In einem Projekt benötigte ich gleichscrollende TStringGrids. Dort habe ich das so gemacht (nur unter Windows getestet):

Eine eigene Komponente (man kann aber auch den Typ TStringGrid im eigen Formular überschreiben):

Code: Alles auswählen

type
  TScrollStringGrid = class(TStringGrid)
  private
    FOnScroll: TNotifyEvent;
  public
    procedure WndProc(var TheMessage: TLMessage); override;
  published
    property OnScroll: TNotifyEvent read FOnScroll write FOnScroll;
  end;
...
procedure TScrollStringGrid.WndProc(
  var TheMessage: TLMessage);
begin
  case TheMessage.Msg of
    {LM_HSCROLL, }LM_VSCROLL:
      if not (csDesigning in ComponentState) and
        Assigned(FOnScroll) then FOnScroll(Self);
  end;
  inherited WndProc(TheMessage);
end;

Im Formular:

Code: Alles auswählen

type
  TForm1 = class(TForm)
...
  private
    FScrollUpdating: Boolean;
  end;
...
procedure TForm1.GridScroll(Sender: TObject);
begin
  if Assigned(Sender) then
    Application.QueueAsyncCall(@ScrollGrid, PtrInt(Sender));
end;
 
procedure TForm1.ScrollGrid(Data: PtrInt);
var
  SG: TStringGrid;
begin
  if csDesigning in ComponentState then Exit;
  if csDestroying in ComponentState then Exit;
  if FScrollUpdating then Exit;
 
  FScrollUpdating := True;
  SG := TStringGrid(TObject(Data));
  if Assigned(SG) then begin
    ScrollGrid1.TopRow := SG.TopRow;
    ScrollGrid1.Row := SG.Row;
    ScrollGrid2.TopRow := SG.TopRow;
    ScrollGrid2.Row := SG.Row;
  end;
  FScrollUpdating := False;
end;

Mit einem Synedit kann man das sicherlich ähnlich machen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

martin_frb
Beiträge: 572
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von martin_frb »

theo hat geschrieben:Abgleichen kann man sie so:

Code: Alles auswählen

Synedit2.TopLine:=Synedit1.TopLine;


Das Problem ist, das Scroll Event mitzukriegen. Ich würde vllt. der Einfachheit halber einen TTimer dafür nehmen.


SynEdit.OnStatusChanged wird fuer topline changes getriggered.

Code: Alles auswählen

 
  property OnStatusChange: TStatusChangeEvent
 
  TStatusChangeEvent = procedure(Sender: TObject; Changes: TSynStatusChanges)
    of object;
  TSynStatusChange = (scCaretX, scCaretY,
    scLeftChar, scTopLine, scLinesInWindow, scCharsInWindow,
    scInsertMode, scModified, scSelection, scReadOnly,
    scFocus,     // received or lost focus
    scOptions    // some Options were changed (only triggered by some optinos)
   );
 


Oder benutze

Code: Alles auswählen

    procedure RegisterStatusChangedHandler(AStatusChangeProc: TStatusChangeEvent; AChanges: TSynStatusChanges);
    procedure UnRegisterStatusChangedHandler(AStatusChangeProc: TStatusChangeEvent);
 

Und filtere die Events mit AChanges.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Zwischen 2 SynEdit Zeilen kopieren

Beitrag von theo »

martin_frb hat geschrieben:
theo hat geschrieben:Abgleichen kann man sie so:

Code: Alles auswählen

Synedit2.TopLine:=Synedit1.TopLine;


Das Problem ist, das Scroll Event mitzukriegen. Ich würde vllt. der Einfachheit halber einen TTimer dafür nehmen.


SynEdit.OnStatusChanged wird fuer topline changes getriggered.


Ah, dann ist das die Lösung. Wusste ich nicht.

Antworten