Autor Beitrag
svern
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 24.10.04 17:29 
Hey,

habe ein kleines Anfängerproblem.

Wie kann ich meinem Programm sagen, dass es auf einen Button-Click warten soll und dann erst weiterarbeiten soll?

Habe gedacht, dass ich das in ner Schleife löse:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    while (B2 = False ) do   // B2 ist boolean für Button 2 angeklickt oder nicht, siehe unten
    begin
      //sleep(50);
      label6.caption:='klappt';
    end;




Für B2:
procedure TForm1.Button2Click(Sender: TObject);
begin
     B2:=true;
     Netzplan();
end;



Naja, geht so jedenfalls nicht, denn das Programm stürzt ab. Komme also nicht mehr an den Button 2 ran.

Hat jemand nen Tipp?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 24.10.04 17:39 
Bei allen anderen Komponenten Enabled auf False setzen. Wenn dann dein Button gedrückt wurde wieder auf True setzen.
Es gibt aber noch andere, elegantere Möglichkeiten:
Packe alle Komponenten die nicht bearbeitet werden sollen auf ein Panel. Dann brauchst du nur das panel disablen.
Oder du arbeitest mit einem zweiten Fenster und zeigst das mit ShowModal an.
svern Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 24.10.04 22:07 
Hey, hab das mal mit Application.ProcessMessages versucht, aber irgendwie klappt das nicht.

Hab das jetzt so in der einen Prozedur:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
 
     while (B2 = False ) do
      begin
        //sleep(50);
        label6.caption:='klappt';
        Application.ProcessMessages;
      end;
      label7.caption:='jojooo';
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
     B2:=true;
     //Netzplan();
end;



Aber er macht das nicht!!! Verdammte Axt, ich check das nicht. Die Prozedur Button2Click wird nicht angewählt, wenn ich die Schleife am Laufen hab... warum nicht? Wie umgeh ich das?
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 24.10.04 22:14 
svern hat folgendes geschrieben:
Die Prozedur Button2Click wird nicht angewählt, wenn ich die Schleife am Laufen hab... warum nicht?

Weil dein Programm mit der Schleife den Hauptthread blockiert.

svern hat folgendes geschrieben:
Wie umgeh ich das?

Mit einem eigenen Thread entweder fürs Warten oder für den Klick.

Gruß,
Jörg

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
svern Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 24.10.04 22:33 
Hey chef,

bin Anfänger und verstehe nicht genau was du damit meinst.

Kannst mir vielleicht ein wenig mehr dazu helfen???
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 24.10.04 22:42 
svern hat folgendes geschrieben:
bin Anfänger und verstehe nicht genau was du damit meinst.

Das hab ich irgendwie kommen sehen ...

svern hat folgendes geschrieben:
Kannst mir vielleicht ein wenig mehr dazu helfen???

Es gibt jetzt zwei Möglichkeiten. Entweder stell' ich den Code hier hin. Dann würde es zwar gehen, aber geholfen ist dir auch nicht. Oder du nimmst dir die Zeit und lernst, was Threads sind und wie man sie verwendet. Einen Anfang könnte dabei dieses Tutorial machen. Oder auch die DF-Suche.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
svern Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 24.10.04 22:48 
Lol, gerade dieses Tut hatte ich mir eben (auf der Suche nach THREADs) auch schon angesehen :D

Und muss nun natürlich feststellen, dass das für mich viel zu hoch ist.
Ich glaube nicht mal, dass ich das richtig hinbekommen würde, wenn du mir hier den Quellcode schreiben würdest.
Naja, hab ja noch 9h bis zur Abgabe meines Projektes, werde schon noch was finden.

Vielleicht gibts ja auch noch andere Ideen, dann immer her damit!!!
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: So 24.10.04 23:01 
Mal was anderes - ich hab das Folgende ausprobiert und es geht:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
implementation
var
  b : Boolean;

procedure TForm1.Button1Click(Sender: TObject);
begin
  b:=False;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  b:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  while b do Application.ProcessMessages;
  Button2.Caption:='Done';
end;

Also hast du irgendwas falsch gemacht oben.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
svern Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 20



BeitragVerfasst: So 24.10.04 23:17 
Super, du hast mich auf meinen Fehler gebracht.

Ist natürlich was in der Logik gewesen,
thx Chef