hallo!
ich habe, wie in vielen beiträgen auch empfohlen und eigentlich logisch, den code, der bei einem onclick-ereignis ausgeführt werden soll, in eine eigene prozedur ausgelagert, weil er an einer anderen stelle auch ausgeführt werden soll.
es handelt sich hierbei um das öffnen einer zweiten form, in die ein datensatz eingegeben werden kann.
der eine aufruf geschieht wie gesagt beim onclick eines menuitems, der zweite beim auftreten eines midi-events.
(bei einigen klingelt's jetzt vielleicht: ich hab schonmal was hierzu gepostet, aber den großteil gelöst)
wenn ich jetzt die zweite form über das menü öffne, geht das einwandfrei.
wenn ich sie danach per midi-event öffne, auch.
wenn ich es aber direkt per midi versuche (ohne vorher per mausklick), klappt's nicht.
und immer, wenn ich es per midi mache, ist das zweite fenster trotz setfocus im hintergrund...
mein verdacht: das message-handling.
weil: wenn ich nach dem aufruf der öffnen-prozedur application.processmessages schreibe (in der midi-methode), zeigt er immerhin die objekte der form an (was er sonst nicht tut), und macht danach, bei erneutem midi-event, schritt für schritt alle eingaben, die ich zwischendurch mache (z. B. text in einem edit-feld markieren).
das heißt für mich:
ein klick-event macht irgendwas, das die weiterverarbeitung von messages erlaubt.
und jetzt endlich die frage:
was muss ich alles in die öffnen-prozedur schreiben, damit, egal, wie ich sie aufrufe, das gleiche passiert?
oder: was muss ich alles beim midi-event vor deren aufruf erledigen?
danke, ich bin echt am ende mit meinem latein
edit:
hier etwas code:
ich schreib aber nur sachen rein, die das problem angehen, weil's sonst zu viel wird...
Delphi-Quellcode:
{-------------------------------------------------------------------------------
domidiin: behandelt eingehende midi-events
-------------------------------------------------------------------------------}
procedure TForm1.DoMidiIn(const aDeviceIndex: integer; const aStatus,
aData1, aData2: byte);
begin
if aStatus = $FE then Exit;
//fernbedienungskram
FSchalter.doremote(aStatus, aData1, aData2);
end;
procedure TForm1.Submanual1Click(Sender: TObject);
begin
FMandef.add; //die eine stelle des aufrufs
end;
{-------------------------------------------------------------------------------
doremote: behandelt schalterbewegungen
-------------------------------------------------------------------------------}
procedure TFSchalter.doremote(aStatus,aData1,aData2:byte);
begin
FMandef.add; //und hier die andere.
application.ProcessMessages; //ein versuch, da wird wenigstens angezeigt
exit;
end;
procedure TFMandef.add;
var y,z:integer;
begin
//dummy bauen
neuman:=true;
with temp do
begin
// hier schreib ich dann was in den dummy
end;
edit(@temp);
end;
procedure TFMandef.edit(zeiger :pointer);
var z:byte;
begin
if visible then //weil ich nicht modal aufrufen darf, hier der blocker
exit;
p:=TPSubmanual(zeiger); //in TMandef globaler zeiger auf das zu bearbeitende objekt
display;
end;
procedure TFMandef.display;
begin
//trägt alle sachen aus p in die felder im form ein, und dann
show;
end;
procedure TFMandef.btokClick(Sender: TObject);
begin
if neuman then
begin
//neuen datensatz erstellen und mit dem dummy füllen, dann
end;
close;
end;
ich hoffe, ich hab nix vergessen...
und bevor einwände kommen:
die gegenseitigen uses-einträge sind richtig (er findet auf jeden fall alles und es läuft ja auch)