Sortierung von TMemo bei Programmstart

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Calanda
Beiträge: 6
Registriert: Di 21. Jun 2022, 07:18
OS, Lazarus, FPC: Windows 10, L 2.0.12 FPC 3.2.0
CPU-Target: 64Bit

Sortierung von TMemo bei Programmstart

Beitrag von Calanda »

Hallo liebe Community
Ich möchte beim Start meiner Applikation in einem TMemo den Inhalt einer Textdatei darstellen.
Das funktioniert wunderbar.
Ebenfalls soll das TMemo bis zuunterst scrollen, sodass die aktuellsten Einträge ersichtlich sind. Das funktioniert z.B. per Button perfekt, aber nicht beim Start der Applikation.
Ich habe den Code jeweils im FormCreate und im FormShow versucht, funktioniert leider nicht.
Wie bekomme ich das hin?

Code: Alles auswählen

Liste.Lines.Clear;
Liste.Lines.LoadFromFile(LogFileLink);
Liste.SelStart := Length(Liste.Text);
Ich sage jetzt schon mal vielen Dank für Tips und Tricks.
Gruss Calanda

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

Re: Sortierung von TMemo bei Programmstart

Beitrag von theo »

Mach ein

Code: Alles auswählen

Application.ProcessMessages;
vor dem Liste.SelStart :=...

Calanda
Beiträge: 6
Registriert: Di 21. Jun 2022, 07:18
OS, Lazarus, FPC: Windows 10, L 2.0.12 FPC 3.2.0
CPU-Target: 64Bit

Re: Sortierung von TMemo bei Programmstart

Beitrag von Calanda »

Danke für den Tip, hat leider nicht funktioniert... :?
Kann es daran liegen, dass ich in einem TEdit ebenfalls ein SetFocus mache?

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: Sortierung von TMemo bei Programmstart

Beitrag von Frank Ranis »

Hallo Calanda,

habe es so hinbekommen .
Nicht schön , aber !

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
 Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

 { TForm1 }

 TForm1 = class(TForm)
  Memo1: TMemo;
  procedure FormCreate(Sender: TObject);
  procedure FormPaint(Sender: TObject);
 private

 public

 end;

var
 Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
 memo1.lines.LoadFromFile('Neues Textdokument.txt');
 Tag:=-1;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
 if Tag=-1
  then
   begin
    memo1.SelStart := Length(memo1.Text);
    tag:=0;
   end;
end;

end. 
Gruß

Frank
www.flz-vortex.de

Calanda
Beiträge: 6
Registriert: Di 21. Jun 2022, 07:18
OS, Lazarus, FPC: Windows 10, L 2.0.12 FPC 3.2.0
CPU-Target: 64Bit

Re: Sortierung von TMemo bei Programmstart

Beitrag von Calanda »

Hallo Frank
Vielen Dank, funktioniert wunderbar!
Danke und liebe Grüsse aus der Schweiz!

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

Re: Sortierung von TMemo bei Programmstart

Beitrag von theo »

Calanda hat geschrieben: Mo 25. Sep 2023, 14:31 Danke für den Tip, hat leider nicht funktioniert... :?
Kann es daran liegen, dass ich in einem TEdit ebenfalls ein SetFocus mache?
Hast du es in OnShow ausprobiert?
Bei mir funktioniert es so:

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Liste.Lines.LoadFromFile('/home/theo/win.txt');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  Application.ProcessMessages;
  Liste.SelStart := Length(Liste.Text);
end;    
@Frank: OnPaint würde ich dafür eher nicht nehmen.
OnActivate würde sich für diesen Weg anbieten.

Frank Ranis
Beiträge: 210
Registriert: Do 24. Jan 2013, 21:22

Re: Sortierung von TMemo bei Programmstart

Beitrag von Frank Ranis »

Hallo theo,

Code: Alles auswählen

procedure TForm1.FormShow(Sender: TObject);
begin
 application.ProcessMessages;
 memo1.SelStart := Length(memo1.Text);
end;
hat unter Win-10 leider nicht funktioniert , unter Linux-Mint schon.

Der Tipp mit

Code: Alles auswählen

procedure TForm1.FormActivate(Sender: TObject);
begin
 memo1.SelStart := Length(memo1.Text);
end;
funzt unter Win und Linux.

Sehr schön , kann man sich meinen ersten Schnellschuss mit dem Tag:=-1, usw.
sparen
und application.ProcessMessages;
braucht es dann auch nicht .

Wenn man auf verschiedenen Plattformen und Widget unterwegs ist erlebt man immer wieder neue Überraschungen .
Und man muß wirklich jedes Programmdetail austesten .

Gruß

Frank
www.flz-vortex.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Sortierung von TMemo bei Programmstart

Beitrag von af0815 »

Ich nutze immer den ersten Aufruf von FormActivate für Initialisierungen vom Programm. Das ist IMHO der beste Zeitpunkt, weil zu diesem Zeitpunkt ganze einfach alles schon stabil ist und ich sicher gehen kann, das die Komponenten alle ihre initialisierung durchlaufen haben. Hier erstelle ich auch alle Fenster die ich benötige und die nicht als Singleton oder dynamisch erzeugt sonst verwendet werden.

Einfach mit einem Flag gegen wiederholtes Aufrufen schützen und das ganze System wird auf allen mir bekannten Plattformen stabil. (War mit Delphi vor Jahrzehnten schon dasselbe, dort habe ich mich auch herumgeärgert, bis ich es auf das Schema umgestellt habe)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 581
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 3.9 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Sortierung von TMemo bei Programmstart

Beitrag von Niesi »

af0815 hat geschrieben: Di 26. Sep 2023, 07:10 Ich nutze immer den ersten Aufruf von FormActivate für Initialisierungen vom Programm. Das ist IMHO der beste Zeitpunkt, weil zu diesem Zeitpunkt ganze einfach alles schon stabil ist und ich sicher gehen kann, das die Komponenten alle ihre initialisierung durchlaufen haben. Hier erstelle ich auch alle Fenster die ich benötige und die nicht als Singleton oder dynamisch erzeugt sonst verwendet werden.

Einfach mit einem Flag gegen wiederholtes Aufrufen schützen und das ganze System wird auf allen mir bekannten Plattformen stabil. (War mit Delphi vor Jahrzehnten schon dasselbe, dort habe ich mich auch herumgeärgert, bis ich es auf das Schema umgestellt habe)
Danke für diesen Tipp, hat mir jetzt geholfen, da ich beim Programmstart den Focus auf ein TEdit setzen möchte und so auch gemacht habe. (Das TEdit sitzt in einem TabSheet.)

Zum Flag habe ich noch eine Frage, bitte: Da nutze ich am besten eine IsActivated: boolean; welche ich in OnCreate auf false setze und beim ersten Aufruf von OnActivate auf true. Dadurch kann ich dann per "if not IsActivated then ..." bei OnActivate meinen Focus auf das richtige TEdit setzen, was dann auch nur beim ersten Durchlauf von OnActivate passiert - oder geht es noch einfacher?

SetFocusInOnActivate.7z
(146.27 KiB) 34-mal heruntergeladen
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6763
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Sortierung von TMemo bei Programmstart

Beitrag von af0815 »

Ich besetze das Flag im FormCreate mit dem Defaultwert 'False'. Die ganzen OnXXX sind mir zu unsicher für das setzen der Defaults. Am liebsten überschreibe ich den Create Construktor und mache dort meine initialisierung.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 581
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 3.9 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Sortierung von TMemo bei Programmstart

Beitrag von Niesi »

af0815 hat geschrieben: Do 25. Jul 2024, 12:03 Ich besetze das Flag im FormCreate mit dem Defaultwert 'False'. Die ganzen OnXXX sind mir zu unsicher für das setzen der Defaults. Am liebsten überschreibe ich den Create Construktor und mache dort meine initialisierung.
Danke. Ja, bisher habe ich auch oft den Create Constructor überschrieben - und dachte, dass das eigentlich nicht so sein soll. Hehe ... ok, das verstehe ich und werde das auch wieder so tun ...

P.S.: Habe das Beispiel mal angepasst, falls mal wer nach so etwas sucht ...
SetFocusInOnActivate.7z
(165.81 KiB) 35-mal heruntergeladen
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Antworten