Console ersetzen durch eigene Form mit TListBox

Rund um die LCL und andere Komponenten
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)

Console ersetzen durch eigene Form mit TListBox

Beitrag von br_klaus »

Hallo,

Leider habe ich bei der Ausgabe auf Console das Problem, daß die immer wieder mal nicht aktiviert wird, und ich daher keine Ausgabe darauf sehen kann (mit debugln).
Beim Durchstöbern des Programms Testall.pas aus dem Lazarus-examples-Verzeichnis habe ich nun eine einfache Möglichkeit gefunden, die Console durch eine Tlistbox in einer eigenen Form zu ersetzen.
Das hat den Vorteil, daß man dann auch diese beliebig zu- und abschalten (habe ich noch nicht implementiert), zeigen und verbergen und ganz den eigenen Vorstellungen anpassen kann (Schrift: Font, Größe, Farbe, Hintergrund, Anzahl maximaler Einträge, etc.). Vielleicht ist das auch bei der Console möglich, aber da weiß ich nicht, wie.

Das ganze sieht so aus:

Code: Alles auswählen

Type TMainForm = class(TForm)
    Eventform: TForm;
    Events: TListBox;
    ClearEventsButton: TButton;
    ShowEventsButton: TButton;
    …..
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
 
    procedure ClearEventsButtonClick(Sender: TObject);
    procedure ShowEventsButtonClick(Sender: TObject);
    procedure EventLn(s: string); // anstelle von debugln
    procedure WatchLn(s:string); // für überwachte Ausdrücke
    …..
// als Beispiel: Angabe der Tastatureingaben
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: char);
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);    
end;
Und dann die Implementierung:

Code: Alles auswählen

uses LCLProc;
 
const maxevent:integer = 500; 
events_on:boolean=true; // zum evtl. Abschalten der Events-Ausgaben, dazu bräuchte es noch einen eigenen Button o.ä.
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
  inherited;
  ;
  EventForm:= Tform.create(self);
    with Eventform do
      begin SetBounds(20,20,200,500); borderstyle := bsSizeable;  Caption:='Events'; end;
  Events:=TListBox.create(self);
    with Events do
      begin
            Parent:=EventForm;  Align:=alclient;  show; end;
end;
procedure TMainForm.FormDestroy(Sender: TObject);
begin
   eventform.Free;
   Events.Free;
  inherited;
end;
 
procedure TMainForm.ClearEventsButtonClick(Sender: TObject);
begin
  Events.items.clear;
end;
procedure TMainForm.ShowEventsButtonClick(Sender: TObject);
   var zeigen:boolean;
begin
   with eventform do
     begin  zeigen:=not visible; if zeigen then show else hide; end;
   with ShowEventsButton do
        if zeigen then caption:='Hide Events' else caption:= 'Show Events';
end;
 
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  EventLn(Sender.Classname + '-KeyDown = '+ dbgS(key) +
  ' Shift = ' + dbgs(Shift));
end;
procedure TMainForm.FormKeyPress(Sender: TObject; var Key: char);
begin
  EventLn(Sender.Classname + '-KeyPress = '+ Key);
end;
procedure TMainForm.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState
  );
begin
  EventLn(Sender.Classname + '-KeyUp = '+ dbgS(key) +
  ' Shift = ' + dbgs(Shift));
end;
Ein Problem ist noch, daß leider nicht sofort der Neueintrag gezeigt wird, da muß dann erst die ScrollBar betätigen. Weiß da einer einen Ausweg?
Und könnte man auch gezielt bestimmte Einträge (zusammenfassen durch Markieren und) löschen?

Herzlichen Dank
P. Nikolaus

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 »

mal bitte packen, wenn mgl. da kann man sich des ma direkt anschauen.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von DiBo33 »

Ein Problem ist noch, daß leider nicht sofort der Neueintrag gezeigt wird, da muß dann erst die ScrollBar betätigen. Weiß da einer einen Ausweg?
Einfach den letzten Eintrag als TopLine setzen

Code: Alles auswählen

Events.TopLine := Events.Lines.Count;
Und könnte man auch gezielt bestimmte Einträge (zusammenfassen durch Markieren und) löschen?
Wenn du es entsprechend implementierst.

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 »

Der Vorteil von Writeln ist ja, dass man die Datentypen nicht umwandeln musst. Wäre nett, wenn du ein array of const verwenden könntest.
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 »

Writeln?
Das ist ja gerade das Problem, daß writeln bei mir nicht funtioniert, sodaß ich auf der Console (soweit sie funktioniert) nur mit debugln schreiben kann.
Und weil mir die schwarze Farbe gar nicht gefällt und auch die anderen Features, die ich erwähnt habe, nicht möglich sind (bzw ich sie nicht kenne), suche ich nach einer anderen Möglickeit.
Ich habe jetzt übrigens festgestellt, daß sich das Problem, daß die letzte Ausgabe nicht zu sehen ist, mit einer TMemo lösen läßt. Bin gerade dabei, eine entsprechende kleine Unit zu estellen.

Wie benutzt dann man denn ein array of const? (habe davon noch nie gehört...)

Packen: in eine Zip-Datei? Ich dachte, es wäre praktischer, den ProgrammCode gleich im Browser lesen zu können. Will s das nächste Mal machen.

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:Writeln?
Das ist ja gerade das Problem, daß writeln bei mir nicht funtioniert, sodaß ich auf der Console (soweit sie funktioniert) nur mit debugln schreiben kann.
Und weil mir die schwarze Farbe gar nicht gefällt und auch die anderen Features, die ich erwähnt habe, nicht möglich sind (bzw ich sie nicht kenne), suche ich nach einer anderen Möglickeit.
Ich habe jetzt übrigens festgestellt, daß sich das Problem, daß die letzte Ausgabe nicht zu sehen ist, mit einer TMemo lösen läßt. Bin gerade dabei, eine entsprechende kleine Unit zu estellen.

Wie benutzt dann man denn ein array of const? (habe davon noch nie gehört...)

Packen: in eine Zip-Datei? Ich dachte, es wäre praktischer, den ProgrammCode gleich im Browser lesen zu können. Will s das nächste Mal machen.
nun deshalb zipen, damit wir uns das mel direkt anschauen können... :D vielleich fällt da so einem Leien wie mir da was ein. so nach dem motto (Versuchen kann man's ja mal.)
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von carli »

Bau dir doch ein Wrapper-Programm, das die Konsole darstellt.
Dein Programm kann ganz normal mit writeln, debugln oder was weiß ich seine Meldungen schreiben.
Das Wrapper-Programm fängt dann die Ausgabe des TProcess auf und zeigt alles in einer etwas schöneren Umgebung an.
Das hat den Vorteil, dass dein Programm dann trotzdem noch die "normale" Konsole benutzt, was eine Ausgabe zum Beispiel automatisieren ließe.

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

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von theo »

Oder benutze einen bestehenden Logger, z.B. http://wiki.lazarus.freepascal.org/MultiLog" onclick="window.open(this.href);return false;

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 »

@carli
wie geht das denn? Ich bin mit der Console recht unzufrieden. Weil man schlecht Sachen raus kopieren kann und es auch keine Scrollbalken gibt.

Eine Log Funktion zu schreiben dürfte kein Problem sein. Z.b. könnte man die Ausgabe sogar mit HTML Formatieren und sich die Logs einfach im Webbrowser anschauen.
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,

ich habe jetzt mein kleines Programm zur Ersetzung der Console ein wenig aktualisisert, daß man es als Include-Datei {$I Events.inc} in das Hauptprogramm einbauen kann.
Anstelle der TListBox benuze ich jetzt eine TMemo. Das hat den Vorteil, daß man da auch hineinschreiben und kopieren und verschieben kann.

Benütze dabei diese eigene Form:

Code: Alles auswählen

type 
TEventform=class(TForm)
  EventsWrapButton: TButton;
  EventsWritePermitButton: TButton;
  EventsClearButton: TSpeedButton;
  events: TMemo;
 
  procedure EventsWrapButtonClick(Sender: TObject); // Zeilenumbruch?
  procedure EventsWritePermitButtonClick(Sender: TObject); // in Memo schreiben?
  procedure EventsClearButtonClick(Sender: TObject); // Memo löschen
 
  procedure EventFormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
      // key = 0 ==> keine Tastatureingabe möglich
  procedure EventFormResize(Sender: TObject);
 
  procedure EventFormCreate(Sender: TObject); // onCreate
  procedure EventFormClose(Sender: TObject; var CloseAction: TCloseAction); // onClose
  procedure EventFormDestroy(Sender: TObject);  
 
  constructor createNew(TheOwner: TComponent);
  end;
in der HauptForm braucht man dann nur diese beiden Buttons mit entspr. Click-Prozedur hinzufügen:
OpenEventsButton : öffnen/schließen der "Konsole"
ShowEventsButton: zeigen/verbergen

und zur Ausgabe in die Memo Eventln(s:string) bzw WatchLn(s:string)

und bei FormDestroy noch hinzufügen:
if EventOpenStatus = eoOpen then
eventform.close

mit EventOpenStatus = (eoOpen, eoClosed)

(Gibt es eine andere Möglichkeit, um festzustellen, ob eine Form
schon erstellt worden ist?)
Dateianhänge
events.zip
(1.92 KiB) 74-mal heruntergeladen

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Re: Console ersetzen durch eigene Form mit TListBox

Beitrag von DiBo33 »

Gibt es eine andere Möglichkeit, um festzustellen, ob eine Form
schon erstellt worden ist?

Code: Alles auswählen

if Assigned(Form) then

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 »

Ich würde kein Memo nehmen, sondern ein THTMLPanel. Dann kannst du es auch noch schön mit HTML und CSS Formatieren*G* und wenn du unter Windows bist, könntest du auch das RichMemo nehmen(Einfach mal nach suchen) gib es für Windows und Mac OS meines wissens.
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,

habe jetzt meine Konsole doch als Unit angelegt. Da braucht es dann nur noch einen Aufruf, um diese zu aktivieren (und zwei TControls, die für Open/Close bzw. Show/Hide dienen).

@if assigned(form) then
scheint nicht zu genügen. Ich mußte die Form am Ende von FormDestroy noch extra auf nil setzen (und dann abfragen, ob nil), dann ging es.

@HTMLPanel
ich will ja keine ausgefeilte Konsole erstellen, sondern nur eine Hilfe für das Programmieren, um schnell aus dem laufenden Programm heraus bestimmte Daten anzeigen zu können.
Auch kenne ich mich in HTML so gut wie überhaupt ncht aus.


Ich wollte eigentlich aus der KonsoleUnit heraus auf die aufrufende Form zugreifen, ohne deren Namen zu kennen. Wie macht man das? Gibt es eine Funktion wie GetForm(Sender)?
Mit GetParentForm(self) geht es nicht. Und wenn ich dann Konsole statt self verwende, ist der Name leer. Vielleicht geht es über Handle?
Ich habe mir jetzt dadurch geholfen, daß ich beim Öffnen der Konsole die aufrufende Form als Parameter mitgeben lasse, dann kann ich ohne weiteres darauf zugreifen. Aber vielleicht gibt es doch eine elegantere Möglichkeit?
Dateianhänge
KonsoleUnit.pas
(6.38 KiB) 80-mal heruntergeladen

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 »

Ich wollte eigentlich aus der KonsoleUnit heraus auf die aufrufende Form zugreifen, ohne deren Namen zu kennen. Wie macht man das? Gibt es eine Funktion wie GetForm(Sender)?
Im Application Objekt gibt es eine Liste mit allen verfügbaren Fenster
Auch kenne ich mich in HTML so gut wie überhaupt ncht aus.
HTML ist "kinderleicht". Es gibt sehr viele gute Dokumenationen im Web z.b. http://de.selfhtml.org/" onclick="window.open(this.href);return false;. Aber du kannst das HTML Panel auch ohne HTML verwenden. Das HTML Panel nutzt für das Rendern Objekte. Diese Objekte(Klassen) können auch Manuell erstellt werden(habe ich aber noch nie gemacht, ich habe nur ein Weg gefunden, um HTML Dateien nicht zwischenspeichern zu müssen).
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 »

pluto hat geschrieben:Im Application Objekt gibt es eine Liste mit allen verfügbaren Fenster
Aber wie mache ich das konkret, wenn ich nur eine procedure habe mit der Variablen Sender: TObject [z.B. procedure Konsole.Formcreate(Sender:TObject)]? Wie kann ich da feststellen, welches der Fenster aus der Liste diesem Sender entspricht, um dann darauf zugreifen zu können?
pluto hat geschrieben:HTML ist "kinderleicht"
Das mag sein, aber wozu soll ich das denn brauchen?
pluto hat geschrieben: Das HTML Panel nutzt für das Rendern Objekte.
Was heißt "Rendern", und wozu brauch ich da Objekte (und was für Objekte? ich benütze nur strings zur zeilenweisen Ausgabe), wenn ich doch nur während der Laufzeit bestimmte Variablen mit ihren Werten beobachten will?


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?

Antworten