Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   alternative zu waitforevent (https://www.delphipraxis.net/135195-alternative-zu-waitforevent.html)

Maltimore 6. Jun 2009 11:27


alternative zu waitforevent
 
Hey!

Ich bins mal wieder. Hab mal wieder ein Neulingsproblem :). Und zwar hab ich hier ein Programm, dass Userdaten aus einer Textdatei einliest. Diese Textdatei kann immer wieder editiert werden, allerdings existiert sie beim allerersten Programmaufruf natürlich noch nicht. Versuche ich aber dann, sie zu öffnen, krieg ich natürlich einen EFOpenerror. Daher habe ich es zuerst versucht mit try-except und dann on EFOpenerror do abzufangen. Das hat dann sogar irgendwann geklappt, allerdings traten dann irgendwelche total merkwürdigen Probleme auf, naja aber drum gehts jetzt auch gar nicht, sondern es geht um das Folgende: Ich überprüfe jetzt mit if fileexists ob die Datei vorhanden ist. Ist sie das, soll sie ausgelesen werden. Ist sie es aber NICHT, soll createuserprofiles aufgerufen werden. Diese Prozedur tut eigentlich auch nicht mehr, als ein zweites Formular aufzurufen, indem man dann die Userdaten zum ersten Mal einstellen kann. So weit, so gut. Die Einstellungen werden in dem formular dann mit form2.button1click; gespeichert. Nun soll aber die ursprüngliche Prozedur aber so lange warten, bis dieses ereignis ausgelöst wurde, dann noch mal etwa eine sekunde warten, um form2.button1click die Möglichkeit zu geben, alles zu speichern. Nun hab ich mich schon endlos umgesehen wie das wohl geht, und bin da auf waitforevent gestoßen. Dazu hab ich zwar auch dir 3 Parameter gesehen, was die aber bewirken ist mir völlig unklar, außerdem kennt mein delphi die prozedur eh nicht und ich hab nicht rausfinden können, was man unter uses einbinden muss, damit es sie kennt. Deswegen hab ich mir einfach selbst ne ziemlich blöde Schleife gebastelt, die eigentlich nur darauf warten soll, dass dieses durchlaufen (eine booolvariable) auf true gesetzt wird. Sie wird ganz am ende von form2.button1click auf true gesetzt. Aber ich versteh einfach nicht warum das nciht klappt:

Delphi-Quellcode:
repeat begin
  sleep(100);
end until form1.durchlaufen = true;
showmessage('Schleife wurde durchlaufen');
Das sollte sie doch eigentlich warten lassen, oder? Naja im Prinzip tut sie das sogar vielleicht, jedenfalls erscheint die Showmesssage die ich darunter eingebaut habe, gar nicht erst. Aber die Prozedur, die nun diese Prozedur aufruft, läuft schon weiter, das erkenn ich immer an der Fehlermeldung, die ich bekomme, weil die userdaten nicht eingelesen wurden.
Naja meine Frage ist jetzt im Prinzip, wie würdet ihr auf das Ereignis form2.button1click warten? und zwar so, dass KEINE EINZIGE sonstige prozedur weiterläuft bis auf eben form2.button1click?

Ich weiß das Problem ist 1. etwas komplexer und 2. blöd formuliert, aber ich hoffe es ist klar geworden, worum es geht.

Mfg,

Maltimore

Apollonius 6. Jun 2009 11:34

Re: alternative zu waitforevent
 
Schau dir mal ShowModal an.

mkinzler 6. Jun 2009 11:35

Re: alternative zu waitforevent
 
Sleep() wartet aktiv! Und da keine Threads verwendet werden, macht das Programm auch nichts anderes mehr. Die Bedingung wird nie wahr -> Endlosschleife

Maltimore 6. Jun 2009 12:35

Re: alternative zu waitforevent
 
@ mkinzler: ähm was du sagst klingt erstmal logisch. es ist aber keine endlossschleife, da sonst ja kaum eine fehlermeldung mit zugriffsverletzung bei adresse soundso kommen könnte. ich habs auch schon mit delay(time: word); auprobiert, klappt aber ebenfalls nicht.


showmodal hab ich noch nie gehört, das seh ich mir jetzt gleich mal an!


Danke schonmal für die Hilfe,

Maltimore

mkinzler 6. Jun 2009 12:40

Re: alternative zu waitforevent
 
Zitat:

es ist aber keine endlossschleife,
Doch, weil sich an dem Wert von form1.durchlaufen nichts ändert.
zudem sollte man bei Boolean-Variablen nie auf False oder True prüfen

Z.B. Statt
Delphi-Quellcode:
if form1.durchlaufen = true then ...
besser
Delphi-Quellcode:
if form1.durchlaufen then ...

Maltimore 6. Jun 2009 13:02

Re: alternative zu waitforevent
 
hm ok wie gesagt deine antwort klingt sehr logisch.. und ich würde auch niemals was dagegen sagen aber wenn ich es starte kommt nunmal ein error in einer zeile weit darunter.. aber wenn das programm in der endlosschleife gefangen wäre dürfte das doch nicht gehen. oh man das mach mich echt fertig. :wall:

Zu showmodal: Das hab ich mir genau angeguckt, scheint genau das richtige zu sein, allerdings zeigt er mir ne zugriffsverletzung wenn ich versuche, mein form2 mit .showmodal statt mit .show zu öffnen :(


mfg,


Maltimore

Apollonius 6. Jun 2009 13:04

Re: alternative zu waitforevent
 
Wo kommt die Zugriffsverletzung und wie lautet die Nachricht?

mkinzler 6. Jun 2009 13:05

Re: alternative zu waitforevent
 
Du solltest vielleicht etwas mehr Code zeigen

Maltimore 6. Jun 2009 16:50

Re: alternative zu waitforevent
 
Hallo!

Ja klar gerne gebe ich noch mehr Code, das ist hier ja kein Mega-Geheimprojekt! Es ist ein Irc-ähnlicher Chat.

Wundert euch bitte nicht über euch komisch vorkommende Zeilen, wenn ich zum beispiel ip und channel erstmal konstant setze usw., das brauch ich jetzt nur zum testen!

also erstmal die formcreate, die den ganzen schnodder dan später aufruft:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var information : string;
begin
durchlaufen := false;
standardnick := '';
standardchannel := '';
ip := '85.214.40.83';
channel := 'Willkommen';
dateipfad := 'C:\Programme\ChatclientbyMalteundSoeren';
information := '1337/85.214.40.83/Maltimore/Willkommen';
loadstringfromfile(dateipfad+'\userdaten.txt', information); //hier geht der ärger los!!
if durchlaufen then
showmessage ('durchlaufen ist true');
sleep(1000);
port := Form1.wertzurueck(1, Information);
ip := Form1.wertzurueck(2, Information);
standardnick :=Form1.wertzurueck(3, Information);
channel :=Form1.wertzurueck(4, Information);
memo1.Clear;
listbox1.items.add('Userlist');
edit1.text := 'Nachricht eingeben';

ClientSocket1.Host:= ip;
ClientSocket1.Active:=true;

repeat
begin
  Nickname := inputbox('Username', 'Bitte geben sie einen gültigen Usernamen ein', standardnick);
  if length(nickname) > 20 then showmessage('Es dürfen nicht mehr als 20 Zeichen sein!');
end;
until length(nickname) < 21;


form1.Caption := 'Angemeldet als: ' + Nickname + '   |||    Channel: Willkommen';
Form1.Anmelden;


end;
dann die loadstringfromfile, die ich hier aus dem forum weitestgehend übernommen habe:

Delphi-Quellcode:
procedure LoadStringFromFile(Filename: string; var LoadString: string);
var
  fs: TFileStream;
begin
  // DER FEHLER IST DAS FORM2.show so schnell durchlaufen wird das man keine chance
  // hat die sachen einzugeben! Programm muss hier warten!
  if fileexists(loadstring) = true then begin
  showmessage('fileexists ist true');
  fs := TFileStream.Create (Filename, fmOpenRead or fmShareDenyNone);
  end else begin
  showmessage('fileexists ist false');
  form1.createuserprofile;
  while form2.modalresult = 0 do
  application.processmessages;
  fs := TFileStream.Create (Filename, fmOpenRead or fmShareDenyNone);
  end;
  try
    SetLength (LoadString, fs.Size);
    if fs.size>0 then
      fs.Read (LoadString[1], fs.Size);
  finally
    fs.Free;
  end;


end;
und noch die createuserprofile:
Delphi-Quellcode:
procedure Tform1.createuserprofile;
begin
form2.Showmodal;
//hier soll später noch mehr rein, mir ist klar dass es sonst keinen sinn macht,
//für form2.showmodal ne eigene prozedur zu bauen
end;
und wenn hier noch die form2.button1click, bei der dann das modalresult auf mrok gesetzt werden soll:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var stringi: string;
var Text_Datei : TextFile;
var pport, pip: bool;
begin
pport := false;
pip := false;
stringi := '';
stringi := Edit1.Text + '/' + Edit2.Text + '/' + Edit3.text + '/' + edit4.text + '/';
form1.port := edit1.text;
form1.ip := edit2.Text;
form1.standardnick := edit3.Text;
form1.standardchannel := edit4.Text;
AssignFile (Text_Datei,form1.dateipfad+'\userdaten.txt');
Rewrite(Text_Datei);
Write(Text_Datei,stringi);
CloseFile(Text_Datei);
form1.durchlaufen := true;
form2.modalresult := mrOK; //das hier ist da wohl das wichtigste für euch
if alterport <> form1.port then
pport := true;
if alteip <> form1.ip then
pip := true;
form1.werteuebernehmen(pport, pip);
form2.Close;
end;
So, ich hoffe das war jetzt nicht ZU viel :)
Wäre euch unendlich dankbar, wenn ihr den Fehler finden würdet.

Apollonius 6. Jun 2009 16:57

Re: alternative zu waitforevent
 
Was ist die Nachricht der Zugriffsverletzung? Bei modalen Formularen musst du übrigens nicht Close aufrufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz