Autor |
Beitrag |
D. Annies
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 18.05.10 18:31
Hi, Delpher,
ich möchte Shellexecute so aufrufen, dass das aufgerufene ProgrammFormular mit speziellen Setbounds-Werten gestartet wird.
Bisher habe ich:
Delphi-Quelltext 1: 2:
| ShellExecute(Handle, nil, pchar(label30.caption+ '\ynot\suchep.exe'), nil, nil, SW_Show); labelanz.caption := inttostr(TbSchueler.recordcount); screen.cursor := crdefault; |
aber die Setbounds-Werte, die in OnFormShow des aufgerufenen Programms stehen, werden nicht genommen, sondern nur eine
Standardeinstellung.
Wie kann man das ändern?
Danke für Hilfe, =  )
Detlef Moderiert von Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 18.05.2010 um 18:36
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 18.05.10 19:51
Und was hat das mit Shellexecute und Parametern zu tun? Du übergibst ja nichtmal nen Parameter..
Ich würde eher sagen, das ist ein Problem im Ereignis "OnShow" des aufgerufenen Programms, dass die Werte nicht übernommen werden.
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 18.05.10 20:27
Hast du dein Programm auch so programmiert, dass es das Setzen der Fensterposition mit Parametern unterstützt?
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Di 18.05.10 21:22
Na, ihr seid ja wieder gut drauf, heute.  )
Gibt's auch so etwas wie eine Lösung? Mit Parametern? Ohne Parameter? Mit Konstanten? Mit Variablen?
Die Lösung bekommt auch eine Schleife! Wegen der Abbruchbedingung frage ich dann wieder, ok?
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Di 18.05.10 21:32
Äh, ist das dein Ernst?
Bei ShellExecute kannst du als 4. Parameter die Aufrufparameter mitgeben.. also ersetze "nil" durch das, was du übergeben willst..
Btw.: Ich weiß nicht, ob nil als Operator (2. Parameter) so gut ist. Versuchs mal mit 'open'
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 18.05.10 21:38
Laut MSDN ist Nil bzw NULL durchaus akzeptiert an dieser Stelle, nur übernimmt dann windows die wahl der operation.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 19.05.10 12:47
Ich habe noch vergessen, zu sagen, dass ich auf die Hilfe (F1) zurzeit nicht zugreifen kann, sonst wäre es ja auch etwas einfacher, die Bedeutung der Parameter zu erkennen.
Soll heißen, ich weiß noch nicht weiter,
Gruß, Detlef = ; ))
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 19.05.10 12:57
Der MSDN Artikel wurde bereits verlinkt - reicht das als Hilfe? 
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 19.05.10 13:01
Leider noch nicht, ich habe jetzt als letzten Wert (also als 6. Wert) den Inhalt 4 und den Inhalt 5 eingetragen (statt NIL),
aber es tut sich nichts.
_________________ ut vires desint, tamen est laudanda voluntas
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Mi 19.05.10 15:39
Hallo,
wenn du hier wirklich Hilfe erwartest, bräuchte ich den besagten Code des aufzurufenden Programms, in dem du die Parameter auswertest und an SetBounds übergibst.
Warum setzt du die bereits genannten Vorschläge nicht um???
2. Parameter: 'open'
4. Parameter: die zu übergebenden Parameter
5. Parameter: nil
6. Parameter: SW_SHOW
Zu den Parametern kann ich der erst mehr sagen, wenn ich weiß, wie das aufgerufene Programm diese verwertet...
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Mi 19.05.10 22:47
Ich komme da ohne ein Beispiel leider nicht weiter - Das Problem habe ich glaube ich,
verständlich beschrieben.
Gruß, Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Mi 19.05.10 22:55
Bevor wir hier noch wochenlang rumdoktorn.. (ich versteh leider nicht, wie man sich an einer Zeile so schwer tun kann?)
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', 'c:\test\test.exe', '-Hallo', nil, SW_Show); |
Damit sollte das Programm test.exe mit Parameter "-Hallo" aufgerufen werden. Stattdessen kannst du natürlich auch eine Variable verwenden (String, und dann auf PChar casten), aber das bekommst du wohl hin..?
Und wenn du noch so tust:
Delphi-Quelltext 1: 2: 3:
| var muh: integer; begin muh := ShellExecute(Handle, 'open', 'c:\test\test.exe', '-Hallo', nil, SW_Show); |
Kannst du muh sogar gegen die auf der Webseite angegebenen Fehlercodes vergleichen, und rausfinden, warum das nicht klappt (in diesem Fall: ERROR_FILE_NOT_FOUND).
Hoffe wir habens nun..
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 20.05.10 09:18
Hi Xentar,
erstmal vielen Dank, dass du dich um mein Problem kümmerst, aber es soll dir nicht zur Last werden.
das Problem bei unserem "rumdoktern" ist ein ganz anderes, bzw. das Folgende:
Dir ist eine symbolische Lösung - z.B. mit dem Parameter '-Hallo' völlig klar, obwohl die Fehlermeldung für mich eher
damit zu tun hat, dass es die aufgerufene exe gar nicht gibt.
Mir fehlt ein explizites Beispiel etwa der Art
ShellExecute(Handle, 'open', 'c:\test\test.exe', 'setbounds(100,50,500,300)', nil, SW_Show);
[was natürlich quatsch ist]
--Oder ist es gar nicht möglich, setbounds zu übergeben?
Ist es doch ein Problem des OnShow des aufgerufenen Prg's?
Wie ist das denn dann zu lösen?
Beachte bitte: Für einen Lernenden ist so ein Problem unüberwindlich - für einen Lehrenden (in diesem Fall du) besteht
die Kunst nicht in der "Verschleierung" oder in einer ermunternden Aufforderung -das wirst du ja wohl hinkriegen,
sondern einfach in einem praktischen Beispiel, nach dem Motto: schreib Folgenden Code hin ...
Der Lernende (in diesem Fall ich) wird dann schon weiterdenken und es auf andere Inhalte ausdehnen können.
Viele Grüße,
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 20.05.10 09:32
Du kannst nicht einfach Code übergeben. Den oder die Parameter muss das gestartete Programm schon auch benutzen. Und dieser Versuch sieht sehr danach aus als unterstützte das Zielprogramm derartige Parameter nicht. (Wenn, dann jedenfalls bestimmt nicht so, sondern einzeln.)
Da du auf das aufgerufene Programm keinen Einfluss hast (den Code hast du ja nicht), musst du das Formular nach dem Start der Anwendung selbst positionieren. Dafür fällt mir spontan CreateProcess ein, weil du damit Zugriff auf das aufgerufene Programm hast (um genau zu sein bekommst du Handle und ID des Prozesses).
Dann kannst du mit EnumWindows alle Fenster durchgehen und in dem Callback schauen, ob es zu deinem Prozess gehört. Wenn das der Fall ist, kannst du dann die Position setzen.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 20.05.10 11:08
Hi, Sebastian,
nun, das aufgerufene Programm ist auch ein Delphi-Prg, hatte ich bisher noch nicht gesagt, weil ich nicht dachte, dass es
wichtig sei.
Ich kommuniziere auch schon mit diesem Prg:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TPatMatForm.ReadStrVariable; var H: THandle; begin H := FindWindow('TBuchMain', NIL); PostMessage(H, WM_READSTR, 0, 0); end;
procedure TPatMatForm.ReceiveStrVariable(var msg: TWMCopyData ); var sText : array[0..256] of Char; begin StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); qFname := sText; Label11.Caption := qFname; Label11.Caption := MinimizeName(qFname, Label11.Canvas, Label11.Width); Label11.Hint := qFname; end; |
(Das ist Code aus dem aufgerufenen Prg mit dem Formularnamen TPatMatForm.
Das rufende Prg hat den Formularnamen TBuchMain)
Na, ja, ob das weiterhilft?
Gruß, Detlef
--- Moderiert von Narses: Beiträge zusammengefasst---
Oh, weiah!
Wenn ich das aufgerufene (Delphi-)Prg aus Delphi heraus starte, hat das Formular die eingestellte Größe (setbounds)!
Wenn ich es als exe starte, nicht, sondern den Standardwert.
Wenn ich es aufrufe, auch nur den Standardwert.
Was ist denn da los??
Detlef
_________________ ut vires desint, tamen est laudanda voluntas
|
|
MaPsTaR
      
Beiträge: 90
Erhaltene Danke: 4
Win XP
Delphi 7 Enterprise
|
Verfasst: Do 20.05.10 18:19
Ich weiß wirklich nicht, was daran so schwer ist...
Aber naja. Der folgende Code ist zwar nur schnell zusammengeschrieben, funktioniert aber.
Aufruf des Programmes:
Delphi-Quelltext 1:
| ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'Project1.exe'), PCHar('100 100 800 600'), nil, SW_SHOW); |
FormShow des aufgerufenen Programmes:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.FormShow(Sender: TObject); var Bounds: Array[0..3] of integer; begin if ParamCount > 1 then Bounds[0] := StrToIntDef(ParamStr(1), Form1.Left) else Bounds[0] := Form1.Left; if ParamCount > 2 then Bounds[1] := StrToIntDef(ParamStr(2), Form1.Top) else Bounds[1] := Form1.Top; if ParamCount > 3 then Bounds[2] := StrToIntDef(ParamStr(3), Form1.Width) else Bounds[2] := Form1.Width; if ParamCount > 4 then Bounds[3] := StrToIntDef(ParamStr(4), Form1.Height) else Bounds[3] := Form1.Height; Form1.SetBounds(Bounds[0], Bounds[1], Bounds[2], Bounds[3]); end; |
Dadurch sollte SetBounds, in diesem Beispiel mit folgenden Werten aufgerufen werden.
Delphi-Quelltext 1:
| SetBounds(100, 100, 800, 600); |
_________________ Liebe Kinder, es stimmt ... solnage auch nur der ertse und lezte Bchutsabe rihctig ist und alle andreen Bcuhsatben irgendwie vorahnden sind,
dann knan man es dennonch lesen, also macht nur weiter so, wir verstehen euch schon
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 20.05.10 21:46
Vielen Dank für die Hilfe, besser als F1 und noch einmal gesagt: Was für dich leicht ist, war für mich nicht erkennbar, - jetzt allerdings ganz klar. Jeder ist mal Lernender und mal Lehrender!
Viele Grüße aus Lübeck,
Detlef
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
_________________ ut vires desint, tamen est laudanda voluntas
|
|
Xentar
      
Beiträge: 2077
Erhaltene Danke: 2
Win XP
Delphi 5 Ent., Delphi 2007 Prof
|
Verfasst: Do 20.05.10 22:07
D. Annies hat folgendes geschrieben : | Vielen Dank für die Hilfe, besser als F1 und noch einmal gesagt: Was für dich leicht ist, war für mich
nicht erkennbar, - jetzt allerdings ganz klar. Jeder ist mal Lernender und mal Lehrender! |
Sorry, aber ich persönlich neige wohl zu sehr dazu, auf die Posts zu achten.
Wenn ich sehe, dass jemand schon über 6 Jahre hier im Forum ist, und über 1500 Posts hat, geh ich immer direkt davon aus, dass derjenige nen Profi ist 
_________________ PROGRAMMER: A device for converting coffee into software.
|
|
D. Annies 
      
Beiträge: 1843
windows 7
D6 Enterprise, D7 Pers und TD 2006
|
Verfasst: Do 20.05.10 22:30
Hi, Xentar,
für dich mag das so auch richtig sein! Für mich gilt nur, dass ich 1500 Fragen hatte, - die übrigens alle beantwortet wurden - und immer noch am dazulernen bin.
Übrigens, was ist denn ein Profi?
Ich übe seit langer Zeit einen sehr schönen Beruf aus, aber ich würde höchstens sagen, dass ich "lebenslänglich" habe, aber ein Profi? Es gibt doch immer wieder Neues, auch zu entdecken!
Vielen Dank an dich und alle anderen Helfer.
Detlef
Moderiert von Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
_________________ ut vires desint, tamen est laudanda voluntas
|
|
|