![]() |
Selbe Procedur mit Button und MenuItem ansprechen?
Ich habe ein Programm geschrieben, in dem ich eine Procedur
Delphi-Quellcode:
sowohl duch einen Button erreichbar machen möchte, alsauch durch ein MenuItem.
procedure TForm1.Button1Click(Sender:TObject);
begin ... //Sender wird NICHT verwendet! end; Also habe ich die oben in Umrissen dargestellte Funktion geschreiben(ursprünglich nur für den Button) und im Objektinpector das OnClick Ereignis des MenuItems auf Button1Click gestellt. Die funktion wird zwar angesprochen aber irgendwie funktioniert der Aufruf einer Funktion in einer dll(in C geschrieben), die nen Thread aufruft nicht richtig, obwohl sie über den Aufruf vom Button anstandslos funktioniert! Sie wird aufgerufen läuft dennoch nicht richtig! Ich gehe davon aus, dass die dll-Funktion fehlerfrei ist, weil ich sie schon einigen Tests unterzogen habe Wie kann das sein? MfG new! |
Re: Selbe Procedur mit Button und MenuItem ansprechen?
So was macht man nicht, das ist unschön. Du solltes Code von der GUI trennen. Schreib eine extra Prozedur und rufe diese in den OnClick Ereignisses des Menüeintrages und der Schaltfläche auf.
|
Re: Selbe Procedur mit Button und MenuItem ansprechen?
@Luckie: Danke für die Antwort! Ich versuchs mal!
|
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Immernoch das gleiche Problem!
Beim Button läuft alles und beim MenuItem zuckt nur einmal der Status in der Statusanzeige im Programm(,dass der Thread läuft)! Ich habe den Code in eine externe Procedur gepackt und diese dann in den OnClick-Ereignissen aufgerufen! |
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Ohne mehr Code, wird da keiner was sagen können ...
|
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Zitat:
die Funktion in der dll funktioniert genauso, wie die Funktion zum Aufrufen! Das Funktionsgerüst sieht momentan(nach Bearbeitung) so aus:
Delphi-Quellcode:
//edit: nen paar Fehler
procedure exec() begin
... //Code, der funktioniert(mit Button1Click) end; procedure TForm1.Button1Click(Sender:TObject); begin exec(); end; procedure TForm1.Execute1Click(Sender:TObject); begin exec(); end; |
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Wir können hier nicht hellsehen.
1. Ist der Code in Exec interessant. 2. Ist der Code in der DLL interessant, sofern du diese erstellt hast. Übrigens noch ein Tipp für dich, wenn du auf Buttons, MenüItems und Toolbars gleiche Funktionen haben willst: Nutze Action-Listen (TActionList). Damit kannst du Actions definieren und diese den Elementen (Buttons, MenüItems etc.) zuweisen. Damit kannst du dann sehr einfach, die Funktion deaktivieren ohne die einzelnen Elemente zu deaktivieren. |
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Delphi-Quellcode:
"sofern du diese erstellt hast": hab ich.
procedure exec();
var f:array[0..4095] of char; s,r:array[0..16000] of char; n:array[0..4] of char; i:integer; begin if(isRep()=0)then begin if form1.unix1.Checked then begin n[0]:='\'; n[1]:='n'; n[2]:=#0; end; if form1.dos1.Checked then begin n[0]:='\'; n[1]:='r'; n[2]:='\'; n[3]:='n'; n[4]:=#0; end; if form1.mac1.Checked then begin n[0]:='\'; n[1]:='r'; n[2]:=#0; end; cpy(f,PChar(form1.edit1.Text)); cpy(s,Pchar(form1.memo1.Lines[0])); if(form1.memo1.Lines.Count>1) then add(s,n); for i:=1 to form1.memo1.Lines.Count-1 do begin add(s,Pchar(form1.memo1.Lines[i])); if(i<>form1.memo1.Lines.Count-1)then begin add(s,n); end; end; cpy(r,Pchar(form1.memo2.Lines[0])); if(form1.memo2.Lines.Count>1) then add(r,n); for i:=1 to form1.memo2.Lines.Count-1 do begin add(r,Pchar(form1.memo2.Lines[i])); if(i<>form1.memo2.Lines.Count-1)then begin add(r,n); end; end; if(s[0]<>#0) then replacer(f,s,r); end else MessageBox(application.Handle,'Is busy!','ERROR!',MB_OK or MB_ICONERROR); end; Diese aber zu posten wäre nen wenig umständlich(viele Quelltextdateien) und rel. lang! und außerdem hat sie immer funktioniert! |
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Bis auf, dass du dir vielleicht eine gewissen Einrückung angewöhnen solltest, damit die Struktur klarer wird, kann ich erstmal nichts erkennen.
Hast du denn schonmal versucht mit einem Debugger dem Fehler auf die Spur zukommen? Vielleicht liegts irgendwie an den Threads. Ich weiß es leider nicht. Auf jeden Fall muss er irgendwo durcheinander kommen. Hast du denn schon mal probiert, wie die DLL bei anderen Komponenten/Ereignissen reagiert. Vielleicht unterscheidet sich ja irgendwo die interne Verarbeitung des OnClick von TMenuItem und TButton, wodurch der Fehler auftritt ... Beispiel für Einrückung:
Delphi-Quellcode:
procedure exec();
var f:array[0..4095] of char; s,r:array[0..16000] of char; n:array[0..4] of char; i:integer; begin if(isRep()=0)then begin if form1.unix1.Checked then begin n[0]:='\'; n[1]:='n'; n[2]:=#0; end; . . . for i:=1 to form1.memo2.Lines.Count-1 do begin add(r,Pchar(form1.memo2.Lines[i])); if(i<>form1.memo2.Lines.Count-1)then begin add(r,n); end; end; if(s[0]<>#0) then replacer(f,s,r); end else MessageBox(application.Handle,'Is busy!','ERROR!',MB_OK or MB_ICONERROR); end; |
Re: Selbe Procedur mit Button und MenuItem ansprechen?
Danke für eure Bemühungen!
Ich werde versuchen das Problem zu finden und/oder Teile in die dll zu verschieben(is ja C) Zitat:
Ich denke ich kennzeichne den Thread als erledigt und poste, wenn ich eine Antwort gefunden habe(und (noch) daran denke) die Lösung! //TerminateThread(SelbeProcedur,0) ergänßt :mrgreen: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz