/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
IPC?
Fra : Niels (niLLer)


Dato : 30-11-00 17:25

I det program jeg er ved at lave (et editor-program der bruger SDI)
skal det være muligt at "starte programmet to gange" evt. også åbne en
fil. Hvis man f.eks. starter programmet én gang og derefter starter
det én gang til, så skal den nye instans af programmet finde den gamle
instans og fortælle den at der skal oprettes et nyt dekoment. Hvis man
starter programmet med en kommandolinieparameter (et filnavn) så skal
den nye instans fortælle den gamle instans at den fil skal åbnes.
I alle tilfælde vil den nye instans lukke så snart den har sendt sin
besked til den gamle instans.

Håber det var til at forstå.

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

 
 
Thomas Schulz (30-11-2000)
Kommentar
Fra : Thomas Schulz


Dato : 30-11-00 23:17

> skal det være muligt at "starte programmet to gange" evt. også åbne en
> fil. Hvis man f.eks. starter programmet én gang og derefter starter
> det én gang til, så skal den nye instans af programmet finde den gamle
> instans og fortælle den at der skal oprettes et nyt dekoment. Hvis man

Let hvis du har window handles (og så via en message defineret af en selv)
men det duer ikke med konsol (altså dos ligende konsol).

Thomas



Niels (niLLer) (01-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 01-12-00 16:29

Just as I expected, "Thomas Schulz" <dk_sz@hotmail.com> came up with
this:

>> skal det være muligt at "starte programmet to gange" evt. også åbne en
>> fil. Hvis man f.eks. starter programmet én gang og derefter starter
>> det én gang til, så skal den nye instans af programmet finde den gamle
>> instans og fortælle den at der skal oprettes et nyt dekoment. Hvis man
>
>Let hvis du har window handles (og så via en message defineret af en selv)
>men det duer ikke med konsol (altså dos ligende konsol).

Jeg kører med ganske almindelige Delphi forms, så det skulle ikke være
et problem. Det fremgår vist egentlig også af spørgsmålet. (Jeg
gider i hvert fald ikke lave en slags editor til Win32 konsol-mode !)

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

N/A (01-12-2000)
Kommentar
Fra : N/A


Dato : 01-12-00 16:34



Niels (niLLer) (01-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 01-12-00 16:34

Just as I expected, "Stig Johansen" <stig@w3data.dk> came up with
this:

>I dit hovedprogram (dpr filen) skal du lave noget ala:
>
>IF ( FindWindow('TDinHovedForm',PCHAR(0)) = 0 ) THEN BEGIN

Jeg har allerede prøvet noget med messages. Der var det godt nok min
egen custom message jeg brugte til at overføre en pointer til en
Record-type der indeholder pointere til to procedurer: NewFile og
OpenFile. Det fungerer så ikke særlig godt. Enten får jeg Access
Violation eller også sker der slet ikke noget. Det er også som om
FindWindow finder vinduet selv om det slet ikke eksisterer! Jeg har
brugt:

OldInst := FindWindow('TMinHovedForm', 'TitelPåHovedform');

> Application.CreateForm(TTDinHovedForm, TDinHovedForm);
>....
> Application.Run;
>END ELSE BEGIN
> IF ParamCount > 0 THEN BEGIN // vi forventer en fil
> Send en message til programmet med filnavnet
> Vistnok WM_copydata.

Det lyder nok egentlig også smartere at bruge dén message. Det bvar
der noget om for kort tid siden, det havde jeg vist bare glemt.

> END;
> SetFocus ( FindWindow('TDinHovedForm',PCHAR(0)) );

God idé!

>END;
>
>Håber det kan bringe dig på sporet.

Jeg har næsten allerede en færdig løsning i hovedet!

>NB! Det er noget fra D3x, så tag forbehold for typerne.

Skulle ikke være noget problem.

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

Niels (niLLer) (01-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 01-12-00 18:20

Just as I expected, "Stig Johansen" <stig@w3data.dk> came up with
this:

>Du får lige noget 'straight from the brain'.

>IF ( FindWindow('TDinHovedForm',PCHAR(0)) = 0 ) THEN BEGIN

Jaa, FindWindow finder desværre det vindue Delphi laver mens man
designer formen. (Det har vinduesklassen "T" + Form.Name.) Jeg ved
ikke rigtig om der er noget at gøre ved det, da jeg ikke lige har lyst
til at afslutte Delphi for at teste mit program. (Det tager mig næsten
et helt minut at starte Delphi!)

> Application.CreateForm(TTDinHovedForm, TDinHovedForm);
>....
> Application.Run;
>END ELSE BEGIN
> IF ParamCount > 0 THEN BEGIN // vi forventer en fil
> Send en message til programmet med filnavnet
> Vistnok WM_copydata.
> END;
> SetFocus ( FindWindow('TDinHovedForm',PCHAR(0)) );
>END;

Jeg ved endnu ikke om det fungerer (se ovenfor), men det kompilerer
da! For at være på den sikre side (med at finde ud af om programmet
faktisk kører) har jeg beslutte mig for at bruge "den go'e gamle
metode" med at lave et Mutex så snart programmet starter, og hvis det
mislykkes så kører programmet allerede. Det er så kun i det tilfælde
at programmet allerede kører at resten af "find vinduet og seng
message" bliver kørt. Desværre lykkes det at oprette Mutex _hver_
_eneste_ gang, altså hvis jeg kører programmet to gange. (Jeg bruger
ikke "Run" i Delphi, men kører i stedet den kompilerede .exe fil
direkte. Her er min kode:

- - - Start DPR fil (projekt-fil) - - -
program MitProgram;

uses
Forms,
Windows,
Messages,
SysUtils,
MainFormUnit in 'MainFormUnit.pas' {MainForm},
{ ... flere forms ... };

{$R *.RES}

var
OldInst: HWND;
cpdStruct: PCopyDataStruct;
Mtx: THandle;
begin
Mtx := CreateMutex(nil, True, 'MinMutex');
if GetLastError <> 0 then
begin
OldInst := FindWindow('TMainForm', PChar(0));
if OldInst > 0 then
begin
New(cpdStruct);
if ParamCount = 0 then
with cpdStruct^ do
begin
dwData := 0;
cbData := 0;
lpData := nil;
end
else
with cpdStruct^ do
begin
dwData := 1;
cbData := Length(ParamStr(1))+1;
lpData := PChar(ParamStr(1));
end;
SendMessage(OldInst, WM_COPYDATA, Application.Handle,
Integer(cpdStruct));
Dispose(cpdStruct);
Halt;
end
end
else
begin
Application.Initialize;
{ ... diverse CreateForm() og App.Title := osv ... }
Application.Run;
ReleaseMutex(Mtx);
end;
end.
- - - Slut DPR fil - - -

- - - Start MainFormUnit.pas - - -
unit MainFormUnit;
{ Jeg har skåret alt irrelevant væk }

interface

type
TMainForm = class(TForm)
{ ... Felter til kontroller og event-handlers ... }
private
procedure CopyData(var Msg: TWMCopyData); message WM_COPYDATA;
end;

inplementation

procedure TMainForm.CopyData(var Msg: TWMCopyData);
begin
case Msg.CopyDataStruct.dwData of
0:
NewFile;
1:
with TEditor.Create(Application) do
begin
LoadFile(PChar(Msg.CopyDataStruct.lpData));
Show;
end;
end;
end;

end.
- - - Slut MainFormUnit.pas - - -

De fleste kan nok se at jeg ikke vil ud med hvilken type program jeg
laver!

Hvis der er nogen der gider teste dette og/eller finde fejl i koden,
såå ... ville jeg nok blive meget glad!

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

Niels (niLLer) (01-12-2000)
Kommentar
Fra : Niels (niLLer)


Dato : 01-12-00 18:30

Just as I expected, nmartin@ispam.com (Niels (niLLer)) came up with
this:

Jææey! Jeg rettede én linie og så fungerede det!

>Jaa, FindWindow finder desværre det vindue Delphi laver mens man
>designer formen. (Det har vinduesklassen "T" + Form.Name.) Jeg ved
>ikke rigtig om der er noget at gøre ved det, da jeg ikke lige har lyst
>til at afslutte Delphi for at teste mit program. (Det tager mig næsten
>et helt minut at starte Delphi!)

Men det ser ud til at det kun er når den bliver kørt _lige_ efter man
har trykket "Run" fra Delphi. Så har den åbenbart ikke nået at free'e
vinduet, og derfor finder den det. Jeg skal bare huske *først* at
trykke "Run" fra Delphi og så køre .exe filen uden for Delphi, mens
programmet allerede kører i debug.

> if GetLastError <> 0 then

Den linie ændrede jeg til:

if GetLastError = ERROR_ALREADY_EXISTS then

>Hvis der er nogen der gider teste dette og/eller finde fejl i koden,
>såå ... ville jeg nok blive meget glad!

Det tror jeg bare jeg trækker i mig igen, nu fungerer det jo!

Niels (aka. niLLer)
--
e-mail: nmartin at iname dot com ICQ UIN: 50187323
http://xoasis.com/~niller/ - niLLer's pages (My programs, in English)
http://whitehat.dk/g4s/ - The G4S Page (Personlig side, på dansk)
-- Behind the end of nowhere!

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste