Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
ShellExecute(Handle, nil, pchar(label30.caption+ '\ynot\suchep.exe'), nilnil, 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 user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 18.05.2010 um 18:36

_________________
ut vires desint, tamen est laudanda voluntas
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 19.05.10 12:57 
Der MSDN Artikel wurde bereits verlinkt - reicht das als Hilfe? :D

_________________
PROGRAMMER: A device for converting coffee into software.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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?)

ausblenden 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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:

ausblenden 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, 00);
end;

procedure TPatMatForm.ReceiveStrVariable(var msg: TWMCopyData );
var sText  : array[0..256of Char;
begin
  StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
  qFname := sText;
  Label11.Caption := qFname;                           {uses FileCtrl/SysUtils}
  Label11.Caption := MinimizeName(qFname,        //Der abzukürzende Pfadname
                                  Label11.Canvas, //Die Referenz-Zeichenfläche
                                  Label11.Width); //Die maximale Ausgabe-Breite
  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 user profile iconNarses: Beiträge zusammengefasst---

Oh, weiah! :shock: :? :? :shock:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 90
Erhaltene Danke: 4

Win XP
Delphi 7 Enterprise
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
  ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'Project1.exe'), PCHar('100 100 800 600'), nil, SW_SHOW);					


FormShow des aufgerufenen Programmes:
ausblenden 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..3of integer;
begin
  if ParamCount > 1
  then
    Bounds[0] := StrToIntDef(ParamStr(1), Form1.Left) //StrToIntDef mit Form1.Left als default, da Wert sonst 0, wenn ParamStr(x) kein Integer ist
  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.
ausblenden Delphi-Quelltext
1:
SetBounds(100100800600);					

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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 user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.

_________________
ut vires desint, tamen est laudanda voluntas
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 20.05.10 22:07 
user profile iconD. Annies hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: 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 user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.

_________________
ut vires desint, tamen est laudanda voluntas