AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

alternative zu waitforevent

Ein Thema von Maltimore · begonnen am 6. Jun 2009 · letzter Beitrag vom 7. Jun 2009
Antwort Antwort
Seite 1 von 3  1 23      
Maltimore

Registriert seit: 2. Mär 2008
37 Beiträge
 
#1

alternative zu waitforevent

  Alt 6. Jun 2009, 11:27
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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 11:34
Schau dir mal ShowModal an.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 11:35
Sleep() wartet aktiv! Und da keine Threads verwendet werden, macht das Programm auch nichts anderes mehr. Die Bedingung wird nie wahr -> Endlosschleife
Markus Kinzler
  Mit Zitat antworten Zitat
Maltimore

Registriert seit: 2. Mär 2008
37 Beiträge
 
#4

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 12:35
@ 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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 12:40
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 if form1.durchlaufen = true then ... besser
if form1.durchlaufen then ...
Markus Kinzler
  Mit Zitat antworten Zitat
Maltimore

Registriert seit: 2. Mär 2008
37 Beiträge
 
#6

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 13:02
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.

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
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 13:04
Wo kommt die Zugriffsverletzung und wie lautet die Nachricht?
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 13:05
Du solltest vielleicht etwas mehr Code zeigen
Markus Kinzler
  Mit Zitat antworten Zitat
Maltimore

Registriert seit: 2. Mär 2008
37 Beiträge
 
#9

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 16:50
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.
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: alternative zu waitforevent

  Alt 6. Jun 2009, 16:57
Was ist die Nachricht der Zugriffsverletzung? Bei modalen Formularen musst du übrigens nicht Close aufrufen.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 Uhr.
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