Einzelnen Beitrag anzeigen

MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Datei mit meinem Programm öffnen

  Alt 23. Jun 2004, 11:46
@Alex_ITA01: Ich will dich nicht kritisieren, aber das Record
Zitat:
Delphi-Quellcode:
type
  PcsCopyDataStruct = ^TcsCopyDataStruct;
  TcsCopyDataStruct =
  packed record
    dwData : DWORD;
    cbData : DWORD;
    lpData : Pointer;
  end;
kannst du dir bspw. sparen, weil es IMHO dem Windows-Original "TCopyDataStruct" entspricht. Das wäre also meiner Ansicht nach ein typischer Fall von "doppelt gemoppelt".

Dann solltest du zumindest den Tipp von MrKnogge beherzigen und den Parameter im "OnCreate" der Form auslesen. "OnShow" wird(soweit ich weiß ) auch wirksam, wenn dein Programm im Hintergrund war und nun wieder angezeigt wird. Das heißt, im ungünstigsten Fall liest du den Parameter einige Male ein. "OnCreate" wird dagegen nur einmal ausgeführt: nämlich beim Erzeugen der Form.

Dann beim Suchen des Fensters gehst du auf Nummer Sicher, wenn du auch den Klassennamen (= den Namen der Form angibst:
hWindow := FindWindow('TMain_Form','ITA'); Und das hier ist aus zwei Gründen zuviel:
Zitat:
Delphi-Quellcode:
      for i := 1 to ParamCount do
      begin
        if (paramcount > 0) and
           FileExists(paramstr(i)) then
        begin
          cdWork.dwData := dwMSGFilepath;
          cdWork.cbData := Length(paramstr(i)) + 1;
          cdWork.lpData := AllocMem(cdWork.cbData);
          try
            CopyMemory(cdWork.lpData,@paramstr(i)[1],cdWork.cbData-1);
            SendMessage(hWindow,WM_COPYDATA,0,lParam(@cdWork));
          finally
            FreeMem(cdWork.lpData,cdWork.cbData);
          end;
        end;
      end;
  1. glaube ich, dass nur eine Datei (= ein Parameter) pro Programm übergeben wird, wenn du es über den Explorer machst (sprich: mehrere markieren, öffnen mit ...). Die Schleife wäre also IMHO nicht notwendig.
  2. ist die gesonderte Prüfung
            if (paramcount > 0) and -sorry!- Unfug, denn die Schleife wird nur ausgeführt, wenn "paramcount" >= Eins ist.
Und diese Prüfung:
Zitat:
Delphi-Quellcode:
if not ((hSemaphore = 0) or
  ((hSemaphore <> 0) and (GetLastError = ERROR_ALREADY_EXISTS))) then
kannst du auch besser gestalten, wenn du auf das "not" verzichtest. Das irritiert bloß, ehrlich gesagt. Laut PSDK gibt es nur 3 Möglichkeiten:
  1. Semaphore wird angelegt, Rückgabewert = Handle
  2. Semaphore existiert schon, Rückgabewert = Handle, GetLastError = ERROR_ALREADY_EXISTS
  3. Semaphore kann nicht angelegt werden, Rückgabewert = Null, GetLastError = Grund
Wenn dein Programm also zwingend vom Semaphore abhängen soll, dann prüfe nach dem Erzeugen einfach auf Null und beende das Programm ggf. Ansonsten verzweigst du für den Fall, dass der/die/das Semaphore schon existiert, indem du auf "ERROR_ALREADY_EXISTS" prüfst und bspw. mit "Halt" das Programm dann abbrichst.
Schau dir dazu mal den Projektquelltext meines Beispiels an. Ich habe bloß nicht geprüft ob der Semaphore Null ist. Den Rest findest du allerdings, und ich hatte keine Probleme damit.

Kurz gesagt: Mir kommt dein Programmcode (bei allem Respekt) zu umständlich vor.


Habe ich jetzt den Jackpot?
  Mit Zitat antworten Zitat