Console ersetzen durch eigene Form mit TListBox

Rund um die LCL und andere Komponenten
pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von pluto »

Da hätte ich noch eine andere Frage, die nur am Rande dazugehört: kann man aus Lazarus heraus XML-Dateien in HTML-Dateien umwandeln?
Es gibt Möglichkeiten um XML Dateien zu laden. Aber vom Umwandeln habe ich bisher noch nichts gehört. Aber du kannst sowas relativ leicht selbst machen.

Zu deinem anderen Problem: Mach mal ein ShowMessage(Sender.ClassName); Wenn ich richtig liege, müsste TForm raus kommen. Wenn das der Fall ist, müsste es so gehen:
(sender as TForm) Damit kannst du auf die Eigenschaften und Methoden von einem Fenster zugreifen. Jedoch nur wenn Sender vom Typ TForm ist.
MFG
Michael Springwald

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von br_klaus »

Hallo, hier eine neuere Version meiner Konsole-Unit (1.1).

Es gab nämlich das Problem, daß die Bildanzeige in der Memo bei jedem lines.delete(0) (sobald die maximale Anzahl überschriten würde) auf den Anfang zurücksprang und dann erst wieder das letzte Element (durch lines.add(s)) zeigte. Das macht bei 500 Einträgen ein starkes Flimmern von ca 1/10 Sekunde Frequenz. Läßt sich das unterbinden, daß die Operationen im Hintergrund geschehen und dann nur das Ergebnis angezeigt wird?
Habe daher ein zweites Tstrings namens Zeilen eingeaut, in dem die Operationen (im Hintergrund) geschehen, dann werden sie mit memo.lines.assign(zeilen) in die Memo übertragen.
Um ständige Aufrufe von delete(0) zu sparen, setze ich gleich die Länge um 1/10 zurück.
Damit aber wieder das letzte Element den Focus erhält, mußte ich doch noch memo.lines.add(s) und zeilen.add(s) extra aufrufen. Da gibt es keine Property Topline o.ä. (Oder wüßte jemand eine andere Möglichkeit?).

Noch eine ganz andere Frage: wie bekomme ich Zugriff auf meine Beiträge (damit ich sie evtl. verändern oder auch löschen kann)?
Dateianhänge
KonsoleUnit.zip
Konsole-Unit (Version 1.1)
(2.12 KiB) 68-mal heruntergeladen

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von MAC »

Form1.listbox1.ItemIndex:=Form1.listbox1.count-1;
Form1.listbox1.ItemIndex:=-1;

makiert den letzten eintrag und demakiert ihn wieder --> springt zu diesem.

Form1.Listbox1.Items.BeginUpdate;
Add
Add
Add
Form1.Listbox1.Items.EndUpdate;

--> part die 2te TString...

viel spaß :)

Code: Alles auswählen

Signatur := nil;

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von br_klaus »

Ja, das ginge, wenn ich eine Listbox hätte. Aber die hab ich ja nicht (der Titel des Beitrags müßte eigentlich geändert werden, aber das schaffe ich nicht....). Statt dessen arbeite ich mit einer TMemo und die hat dann nur einen TStrings.

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von Maik81ftl »

br_klaus hat geschrieben:Ja, das ginge, wenn ich eine Listbox hätte. Aber die hab ich ja nicht (der Titel des Beitrags müßte eigentlich geändert werden, aber das schaffe ich nicht....). Statt dessen arbeite ich mit einer TMemo und die hat dann nur einen TStrings.
Sollte TMemo nicht Analog mit der Variante von MAC gehen?

ich Arbeite bei solchen sachen lieber mit TStringlist, da diese ja am ende fast 1 zu 1 in ein TListBox bzw TMemo kompiet werden können und nicht wegen einer Werte ein extra Memo im Formular verstecken (Visible = False) einbinden muß.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von pluto »

Ein TMemo müsste auch ein BeginUpdate und EndUpdate haben. Die Komponenten sind sich recht Ähnlich.
MFG
Michael Springwald

Maik81ftl
Beiträge: 619
Registriert: Mi 9. Mär 2011, 16:34
OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
CPU-Target: 64Bit
Wohnort: seit 01.06.2011 in Wahlstedt

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von Maik81ftl »

pluto hat geschrieben:Ein TMemo müsste auch ein BeginUpdate und EndUpdate haben. Die Komponenten sind sich recht Ähnlich.
Jopp haben diese. fress sogar 'nen Bessen + Kehrfrau wenn sie Instanzen nicht irgendwo her sogar mal den gleichen Vorfahren haben.

Suche 10% loaded...........
Suche 100% Loaded..........

Den gemeinsamen Nenner haben Sie im Lines: TStrings der Gefunden, Eine Weitere Verzweigung Bringt Sie Liebe r User auf die Klasse

Code: Alles auswählen

TStrings = class(TPersistent)
. Für weitere frage füllen Die bitte dieses Forum oder lesen Sie ihre Hilfe. :D

sry, aber mir bekommt die Freitaler luft nicht mehr. :lol:
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von pluto »

Die meisten bzw. einige Komponenten in der LCL verwenden eine TStringlist. Z.B. TListBox, TMemo, TComboBox, TColorBox, . Komisch mehr fallen mir im Moment nicht ein.
MFG
Michael Springwald

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von br_klaus »

Herzlichen Dank für die schnellen Antworten.
Habe nicht gewußt, daß BeginUpdate und EndUpdate die Prozeduren im Hintergrund ablaufen lassen. Werde es gleich ausprobieren.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von pluto »

Habe nicht gewußt, daß BeginUpdate und EndUpdate die Prozeduren im Hintergrund ablaufen lasse
Nun. Sie sorgen dafür, dass die Komponenten sich nicht bei jeder Veränderung neu zeichnen. Wenn du 1000 Einträge in die ListBox erstellt, wäre das ja recht langsam, wenn bei jedem Eintrag die Komplette Liste neu gezeichnet wird oder? Einmal reicht doch. Genau dafür sind die da. Im Allgemeinen haben diese Methoden glaube ich so gut wie alle Komponenten.
MFG
Michael Springwald

br_klaus
Beiträge: 244
Registriert: Do 21. Jan 2010, 22:33
OS, Lazarus, FPC: Windows Vista (L 0.9.31 FPC 2.5.1)
CPU-Target: 32Bit
Wohnort: z.z. Brasilien, sonst 82335 Berg-Leoni (südlich von München)

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von br_klaus »

Bin doch bei meiner TStrings namens zeilen neben der memo geblieben. Das BeginUpdate und EndUpdate dauert so lange, daß dann eine Stauung in der Textausgabe geschieht (bei 500 Zeilen pro Sekunde oder mehr macht sich das schon bemerkbar).

Wenn ich hingegen schreibe

Code: Alles auswählen

begin
  if zeilen.count>=maxcount-1 then
  begin
     for i:=1 to max(1, maxcount div 10) do
            zeilen.delete(0);  // Es gibt wohl keine Funktion, mehrere Zeilen hintereinander gleichzeitig zu löschen?
     memo.lines.assign(zeilen)  // Damit wird zeilen nach memo.lines übertragen
   end;
  zeilen.add(s);
  memo.lines.add(s);
end;
dann geht das viel rascher. Das letzte memo.lines.add(s) muß deshalb stehen, damit auch wirklich wieder die letzte Zeile angezeigt wird. (Oder gibt es da auch eine Eigenschaft, die man nur zu setzen braucht?)

Etwas ähnliches mußte ich auch beim Wechsel zwischen WordWrap = true/false machen, weil da auch das Programm immer zur ersten Zeile springt:

Code: Alles auswählen

begin
       n:= zeilen.count-1; s:= zeilen[n]; zeilen.delete(n);
       memo.lines.assign(zeilen);
       memo.wordwrap:= not memo.wordwrap;
       zeilen.add(s); memo.lines.add(s);
end;

Antworten