[erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Für Fragen von Einsteigern und Programmieranfängern...
alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

[erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von alfware17 »

Hallo,

ich habe eine Unit, die von einem einfachen Konsolen-Programm aus, von einem Lazarus-Batch-Programm und von einem Fenster aus aufgerufen werden soll. Da sind ein paar Writeln drin, die die beiden Batch-Varianten die Ergebnisse ausgeben lassen, im Online-Teil bin ich nur an den Berechnungen interessiert.
Leider fällt das nun auf die Nase, "File not open", Was kann ich da machen? Das Lazarus-Batch-Programm öffnet ja selbst ein Fenster (liegt wohl am Anwendungstyp - ansonsten kann ich keine Unterschiede erkennen, die Units habe ich alle kopiert).

Ich kann die Writeln gerne vom Online-Programm mit ausgeben lassen, es muß nicht unterdrückt werden.

So auf Anhieb fällt mir nur eine Lösung über bedingte Compilierung ein, also einen Schalter zum Ermöglichen oder Unterdrücken der Writeln. Gibt es eine elegantere Lösung?

Vielen Dank
Dateianhänge
prioparmonline.zip
(163.57 KiB) 52-mal heruntergeladen
prioparm.zip
(11.41 KiB) 42-mal heruntergeladen
Zuletzt geändert von alfware17 am Di 1. Aug 2023, 10:27, insgesamt 1-mal geändert.

Joh
Lazarusforum e. V.
Beiträge: 191
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Re: Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von Joh »

Warum nicht einfach unter

Code: Alles auswählen

Projekt
- Einstellungen
  - Compilereinstellungen
    - Konfiguration und Ziele
      - Win32-GUI-Anwendung
den Haken wegmachen? Dann hast du unter der GUI das zusätzliche Konsolenfenster...

Oder habe ich da was flasch verstanden?
just my two Beer

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6216
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: Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von af0815 »

Oder den LazLogger nehmen. Damit wird mit Debugln auf die Konsole geschrieben, wenn eine vorhanden ist. LazLogger kann auch in eine Datei umleiten, wenn nötig.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von alfware17 »

Joh hat geschrieben:
Mo 31. Jul 2023, 18:44
Warum nicht einfach unter

Code: Alles auswählen

Projekt
- Einstellungen
  - Compilereinstellungen
    - Konfiguration und Ziele
      - Win32-GUI-Anwendung
den Haken wegmachen? Dann hast du unter der GUI das zusätzliche Konsolenfenster...

Oder habe ich da was flasch verstanden?
Ja, genau das wollte ich haben. Danke!

Ich könnte es ausprobieren, aber vielleicht weißt du es ja auch. Wenn ich jetzt auf die Idee käme die 64bit Lazarus IDE zu benutzen,
heißt der Einstellungspunkt dann anders? Ich meine ja nur, Häkchen weg und man bekommt zusätzliche Funktion. Wenn ich so was
entwerfen würde, würde ich sagen Häkchen an und man hat die zuätzliche Datei

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

Re: Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von theo »

alfware17 hat geschrieben:
Di 1. Aug 2023, 10:26
Wenn ich jetzt auf die Idee käme die 64bit Lazarus IDE zu benutzen,
heißt der Einstellungspunkt dann anders?
Soweit ich weiß, heißt das nur aus "historischen" Gründen "Win32-GUI-Anwendung".
Es sollte keinen Unterschied machen, ob 32 oder 64 bit.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von fliegermichl »

Du kannst auch das Häkchen weglassen und rufst bei Bedarf

Code: Alles auswählen

allocConsole
auf.

Edit: AllocConsole alleine reicht nicht aus. Aber so geht's (getestet)

Code: Alles auswählen

 AllocConsole;      // in Windows unit
 IsConsole := True; // in System unit
 SysInitStdIO;      // in System unit
 WriteLn('Hallo Welt');

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von Mathias »

Gibt es auch sowas ähnliches wie "AllocConsole" für Linux ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von theo »

Mathias hat geschrieben:
Mi 2. Aug 2023, 15:37
Gibt es auch sowas ähnliches wie "AllocConsole" für Linux ?
Auf Linux schmiert die Anwendung nicht ab, wenn keine Shell da ist und es ein "writeln" gibt. Auf Windows schon.
Das kann man nicht vergleichen.

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von Mathias »

Auf Linux schmiert die Anwendung nicht ab, wenn keine Shell da ist und es ein "writeln" gibt. Auf Windows schon.
Das kann man nicht vergleichen.
Die ist mir schon bekannt.
Ich dachte an einen Befehl, welcher eine Konsole öffnet.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von theo »

Kommt drauf an, was du willst.
Unter KDE/OpenSuse öffnet sich eine Terminalemulation z.B. mit

Code: Alles auswählen

  SysUtils.ExecuteProcess('/usr/bin/konsole', '', []); 
oder

Code: Alles auswählen

  SysUtils.ExecuteProcess('/usr/bin/xterm', '', []);  
S.a. https://wiki.freepascal.org/Executing_External_Programs

PascalDragon
Beiträge: 834
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von PascalDragon »

Mathias hat geschrieben:
Mi 2. Aug 2023, 17:06
Auf Linux schmiert die Anwendung nicht ab, wenn keine Shell da ist und es ein "writeln" gibt. Auf Windows schon.
Das kann man nicht vergleichen.
Die ist mir schon bekannt.
Ich dachte an einen Befehl, welcher eine Konsole öffnet.
Das kann man nicht vergleichen. Unter Windows allokiert AllocConsole eine Konsole für den laufenden Prozess. Dies ist unter Linux einfach nicht möglich, das Beispiel von theo öffnet eine Konsole als Kind, du kannst dann aber in diese nicht schreiben (zumindest nicht trivial). Außerdem kann es unter Linux beliebige Konsolen (auch Terminalemulatoren genannt) geben, es gibt nicht die Konsole, die du öffnen könntest.
FPC Compiler Entwickler

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von Socke »

Mathias hat geschrieben:
Mi 2. Aug 2023, 17:06
Ich dachte an einen Befehl, welcher eine Konsole öffnet.
Wenn du ein Terminal öffnen möchstest, in dem STDOUT angezeigt wird, kannst du das natürlich über ein weiteres Programm tun. Du könntest z.B. deine Konsole anweisen, tail zu starten, was dann STDOUT von deinem Prozess ausgibt.

Code: Alles auswählen

SysUtils.ExecuteProcess('/usr/bin/xterm', '', ['-e', 'tail', '-f', '/proc/<myprocessid>/fd/0']);  
Dabei kann es natürlich passieren, dass STDOUT gar nicht offen ist oder nach /dev/null verweist. Dann wirst du da nicht viel sehen. Auf der anderen Seite sollte es recht einfach sein, eine kleine Lazarus-Anwendung zu schreiben, die das ohne xterm oder tail durchführt oder deine LazLogger-Ausgabe anzeigt.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von Mathias »

@Socke
Irgendwie hast ein einen Verdreher mit dem "[", es lässt sich nicht kompilieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von Socke »

Mathias hat geschrieben:
Do 3. Aug 2023, 16:04
@Socke
Irgendwie hast ein einen Verdreher mit dem "[", es lässt sich nicht kompilieren.
Ich hatte die Parameter vertauscht, richtig wäre:

Code: Alles auswählen

SysUtils.ExecuteProcess('/usr/bin/xterm', ['-e', 'tail', '-f', '/proc/<myprocessid>/fd/0'], []);  
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

alfware17
Beiträge: 134
Registriert: Di 14. Dez 2010, 23:27

Re: [erledigt] Wie kann ein Fensterprogramm trotzdem Writeln schreiben?

Beitrag von alfware17 »

Sagt mal.... Gibt es die Ausgabe in Linux auch für Dummies/einfache Variante?

Wenn ich das

SysUtils.ExecuteProcess('/usr/bin/xterm', ['-e', 'tail', '-f', '/proc/<myprocessid>/fd/0'], []);

von oben so in meinen Quelltext schreibe, bringt mir Lazarus eine System-Exception...

Ich wollte das Programm, welches unter Windows lief, nun auch mal unter Linux testen.... Dabei geht es mir immer noch darum, ein paar Testausgaben meines Algorithmus zu sehen und da finde ich Writeln immer noch am einfachsten. Ich könnte die auch alle in ein Fenster mit einer Textview? stecken, aber warum das Programm unter Linux ändern müssen?

Antworten