Statusbar aktualisiert nicht

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Statusbar aktualisiert nicht

Beitrag von Fraenzken »

Hallo,

ich mache momentan meine ersten Schritte in Lazarus und habe ein Verständnisproblem:

Ich habe ein Kommandozeilen-Programm erstellt, das nacheinander die in ParamStr übergebenen Bilder lädt und (mit einigen Modifikationen) an ein externes Programm übergibt, das sie seinerseits weiter modifiziert.

Das klappt alles ganz gut; doch nun fehlen mir einige Funktionalitäten. So würde ich gerne den Verarbeitungsfortschritt grafisch durch einen Fortschrittsbalken sichtbar machen. Außerdem möchte ich, dass man über eine GUI bestimmte Grundeinstellungen des Programms verändern kann, sofern es ohne Parameter aufgerufen wurde (also Paramcount = 0 ist).

Ich müsste also das Konsolenprogramm irgendwie in ein GUI-Programm umwandeln, das in einem eigenen Fenster läuft. Wie mache ich das? Wenn ich ein neues GUI-Projekt erstelle, erhalte ich eine UNIT mit einem Form. Dort kann ich zwar Buttons einfügen etc.; ich weiß aber nicht, wie ich in diesem Form etwas laufen lasse, ohne vorher ein Event (wie z.B. einen Mausklick auf einen Button) ausgelöst zu haben.

Ich hoffe, ich habe mein Problem verständlich ausgedrückt... Danke jedenfalls für euren Input!
Zuletzt geändert von Fraenzken am Mi 17. Feb 2016, 11:27, insgesamt 1-mal geändert.

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

Re: Programm in Fenster laufen lassen

Beitrag von theo »

Du kannst OnCreate oder OnShow des Formulars verwenden.

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: Programm in Fenster laufen lassen

Beitrag von Fraenzken »

theo hat geschrieben:Du kannst OnCreate oder OnShow des Formulars verwenden.

Vielen Dank, Theo. Irgendwie durchblicke ich das Ganze aber noch nicht.
Um mal ganz einfach anzufangen: Ich habe eine neue grafische FreePascal-Anwendung erstellt. Der Editor zeigt Unit1:

Code: Alles auswählen

unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
 
type
  TForm1 = class(TForm)
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
end.


Mal angenommen, ich möchte Form1 nur nutzen, um darin etwas zu schreiben (z.B. "Writeln ('Wilkommen!')") - ohne vorheriges Event. Wie gehe ich dann vor? Muss ich dazu die lpr-Datei bearbeiten? Falls ja: Wie sorge ich dafür, dass das, was ich schreibe, in Form1 auftaucht? Und nicht in irgendeinem Konsolenfenster oder sonstwo?

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

Re: Programm in Fenster laufen lassen

Beitrag von theo »

Ach du liebe Zeit. Du hast gar keinen Plan? :wink:

Schau mal hier. http://www.delphi-treff.de/tutorials/vc ... r-rechner/
Das ist zwar für Delphi, aber es fast gleich.

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: Programm in Fenster laufen lassen

Beitrag von Fraenzken »

theo hat geschrieben:Ach du liebe Zeit. Du hast gar keinen Plan? :wink:


Leider nein. :( Ich konnte mal Turbo-Pascal :wink:

theo hat geschrieben:Schau mal hier. http://www.delphi-treff.de/tutorials/vc ... r-rechner/
Das ist zwar für Delphi, aber es fast gleich.


Ich glaube, das hilft mir schon weiter.
Ich habe es übrigens zumindest schon geschafft, den Fenstertitel zu modifizieren und das Fenster maximiert zu starten.

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: Programm in Fenster laufen lassen

Beitrag von Fraenzken »

Leider habe ich wieder ein Problem:

Ich habe eine Prozedur erstellt, die bei "Form1.Onactivate" ausgeführt wird. In dieser Prozedur werden die in der Kommandozeile übergebenen Bilder modifiziert.
Ich möchte im Fom1 einen Button integrieren, mit dem ich die Verarbeitung abbrechen kann. Leider erscheint dieser Button aber erst, wenn die Prozedur abgeschlossen ist (er ist dann also wertlos, weil ohnehin schon alles vorbei ist...). Ähnliches gilt für meine Statusbar, in der ich den Fortschritt in Prozent angeben möchte: Sie erscheint erst, wenn alles gelaufen ist (also bei 100%). Und das, obwohl ich in der bei onactivate aufgerufenen Prozedur explizit auf diese Statusbar schreibend zugreife. Was mache ich falsch?

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

Re: Statusbar aktualisiert nicht

Beitrag von theo »

Ist halt singe threaded.
Du kannst in deiner lange andauernden Prozedur sporadisch im Loop: Application.Processmessages aufrufen.
Damit reagiert das GUI Programm auf allfällig anstehende Nachrichten wie Maus Clicks oder Updates beim Zeichnen.

Fraenzken
Beiträge: 24
Registriert: Mi 10. Feb 2016, 10:30

Re: Statusbar aktualisiert nicht

Beitrag von Fraenzken »

theo hat geschrieben:Ist halt singe threaded.
Du kannst in deiner lange andauernden Prozedur sporadisch im Loop: Application.Processmessages aufrufen.
Damit reagiert das GUI Programm auf allfällig anstehende Nachrichten wie Maus Clicks oder Updates beim Zeichnen.


Klappt wunderbar, vielen Dank für deine Hilfe!

Antworten