Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Selbe Procedur mit Button und MenuItem ansprechen? (https://www.delphipraxis.net/67899-selbe-procedur-mit-button-und-menuitem-ansprechen.html)

new32 21. Apr 2006 16:08


Selbe Procedur mit Button und MenuItem ansprechen?
 
Ich habe ein Programm geschrieben, in dem ich eine Procedur
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender:TObject);
begin
...                //Sender wird NICHT verwendet!
end;
sowohl duch einen Button erreichbar machen möchte, alsauch durch ein MenuItem.

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!

Luckie 21. Apr 2006 16:38

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.

new32 21. Apr 2006 16:41

Re: Selbe Procedur mit Button und MenuItem ansprechen?
 
@Luckie: Danke für die Antwort! Ich versuchs mal!

new32 21. Apr 2006 16:53

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!

jim_raynor 21. Apr 2006 17:07

Re: Selbe Procedur mit Button und MenuItem ansprechen?
 
Ohne mehr Code, wird da keiner was sagen können ...

new32 21. Apr 2006 17:15

Re: Selbe Procedur mit Button und MenuItem ansprechen?
 
Zitat:

Zitat von jim_raynor
Ohne mehr Code, wird da keiner was sagen können ...

Welchen denn?
die Funktion in der dll funktioniert genauso, wie die Funktion zum Aufrufen!

Das Funktionsgerüst sieht momentan(nach Bearbeitung) so aus:
Delphi-Quellcode:
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;
//edit: nen paar Fehler

jim_raynor 21. Apr 2006 17:19

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.

new32 21. Apr 2006 17:30

Re: Selbe Procedur mit Button und MenuItem ansprechen?
 
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;
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;
"sofern du diese erstellt hast": hab ich.
Diese aber zu posten wäre nen wenig umständlich(viele Quelltextdateien) und rel. lang! und außerdem hat sie immer funktioniert!

jim_raynor 21. Apr 2006 18:01

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;

new32 21. Apr 2006 18:27

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:

Zitat von jim_raynor
Bis auf, dass du dir vielleicht eine gewissen Einrückung angewöhnen solltest, damit die Struktur klarer wird, kann ich erstmal nichts erkennen.

Mach ich normalerweise auch (zumindest bei komplexeren Funktionen)! :wink:

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