Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Programm lässt sich nicht beenden (https://www.delphipraxis.net/77449-programm-laesst-sich-nicht-beenden.html)

Radon 19. Sep 2006 18:55


Programm lässt sich nicht beenden
 
Hi

Ich habe ein Programm, welches normal gestartet werden kann und welches über das Kontextmenü aufgerufen werden kann.

Dabei überprüft das Programm am Anfang, ob sich etwas im ParamStr(1) befindet. In dem Falle wäre das Programm über das Kontextmenü aufgerufen worden und dann soll es nur eine subprozedur ausführen und sich dann beenden. Andernfalls soll es das MainForm Zeigen wo man dann eben an die Einstellungen kommt.

Hier mal der Code:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  if ParamStr(1) <> '' then
  begin
    ShowMessage('Sub-Programmstart');
    subprogramm;
    close;
    ShowMessage('Programm konnte nicht geschlossen werden!');
  end
  else
    ERegistry;
    ShowMessage('Programmstart');
    Form1.Visible := true;
end;
Das Problem liegt daran, dass es das close nach dem subprogramm einfach ignoriert und trotzdem die Aufgaben im else-Teil abarbeitet. Das soll aber nicht sein!

Wie kann ich das so machen, dass es falls der ParamStr(1) etwas enthält, das Programm unsichtbar das subprogramm ausführt?


Man muss dazu sagen ich bin anfänger und tue mir noch etwas schwer :angel2:

HalloDu 19. Sep 2006 18:56

Re: Programm lässt sich nicht beenden
 
Du kannst kein Programm nicht in dem OnCreate Ereignis beenden oder verstecken.
Ich lös das immer mit nem Timer.

himitsu 19. Sep 2006 19:01

Re: Programm lässt sich nicht beenden
 
Gehl mal in die Projektdatei (.dpr), dort einfach die Zeilen mit Application überspringen, wenn etwas anderes gmacht werden soll

Delphi-Quellcode:
Begin
  If ParamStr(1) = ... Then Begin
    was anderes...
  End Else Begin
    Application...
    ...
  End;
End;

Radon 19. Sep 2006 19:05

Re: Programm lässt sich nicht beenden
 
Gibt es dann vielleicht ne vorgeschaltete Funktion oder so? Oder kann ich das Form1. irgendwie hinterher aufrufen? Für mich siehts so aus, als ob der einfach den else-abschnitt ausführt, auch wenn die Bedingung dafür nicht erfüllt ist, da die ShowMessage erscheint.

@ himitsu: Sorry, ich versteh leider nicht was du meinst :|

dino 19. Sep 2006 19:07

Re: Programm lässt sich nicht beenden
 
zu radons verteidigung: ich auch nicht

Matze 19. Sep 2006 19:38

Re: Programm lässt sich nicht beenden
 
Projekt -> Quelltext anzeigen und dort kommt Himis Code hinein.

dino 19. Sep 2006 19:47

Re: Programm lässt sich nicht beenden
 
weiss zwar nicht, ob radon geholfen ist, aber ich würde gerne wissen, was ich damit mache

Matze 19. Sep 2006 19:50

Re: Programm lässt sich nicht beenden
 
Zitat:

Zitat von dino
weiss zwar nicht, ob radon geholfen ist, aber ich würde gerne wissen, was ich damit mache

Wie meinst du das? Du hast beispielsweise etwas wie

Delphi-Quellcode:
program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {FrmMain};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TFrmMain, FrmMain);
  Application.Run;
end.
Dieses begin - end wird gleich am Anfang des Programmstarts ausgeführt. Möchtest du also Dinge direkt dort beinflussen, dann kannst du hier schon eingreifen.

dino 19. Sep 2006 19:55

Re: Programm lässt sich nicht beenden
 
ah danke

ringli 19. Sep 2006 19:57

Re: Programm lässt sich nicht beenden
 
Ich würd mir als erstes mal deinen ELSE-Teil näher angucken. Dort fehlt meines Erachtens nach ein BEGIN..END-Block. So steht im ELSE-Teil nämlich nur ERegistry. Aber ich vermute mal das die beiden nächsten Zeilen eigentlich auch dazugehören sollen.

Sunlight7 19. Sep 2006 20:12

Re: Programm lässt sich nicht beenden
 
Oder einfach so...

Delphi-Quellcode:
program Project1;

uses
  Forms,
  ...
  Unit1 in 'Unit1.pas' {FrmMain};

{$R *.res}

begin
  Application.Initialize;

  if ParamStr(1) <> '' then
  begin
    ShowMessage('Sub-Programmstart');
    subprogramm;
    ShowMessage('Programm wird jetzt beendet.');
    Exit;
  end; // Dann brauchts erst gar kein else

  Application.CreateForm(TFrmMain, FrmMain);
  Application.Run;
end.

dino 19. Sep 2006 20:14

Re: Programm lässt sich nicht beenden
 
stimmt ist mir garnicht aufgefallen :)(sorry ich miche mich schon wieder ein, aber mich interessiert sein Problem nunmal)

Radon 19. Sep 2006 21:26

Re: Programm lässt sich nicht beenden
 
ööh.. hups.

daran lags wohl anscheinend.

naja, bin ja anfänger. <- ausrede
und hab heut wieder was gelernt. ich mach das lieber mit dem else, in den übergeordneten Quellcode will ich mal lieber nicht unbedingt eingreifen wenn es auch noch anders geht.

Danke euch allen!! :love:

Radon 20. Sep 2006 13:24

Re: Programm lässt sich nicht beenden
 
Hat geklappt. Aber nun hat sich ein neues Problem aufgetan:

Delphi-Quellcode:
    FFileExt := ExtractFileExt(ParamStr(1)) ;

    case FFileExt of
      '.ut2': FPathToDir := '\Maps\';
      '.utx': FPathToDir := '\Textures\';
      '.usx': FPathToDir := '\StaticMeshes\';
      '.uax': FPathToDir := '\Sounds\';
      '.ukx': FPathToDir := '\Animations\';
      '.ka': FPathToDir := '\KarmaData\';
      '.ogg': FPathToDir := '\Music\';
      '.upl': FPathToDir := '\System\';
      '.u' : FPathToDir := '\System\';
      '.ucl': FPathToDir := '\System\';
      '.frt': FPathToDir := '\System\';
      '.int': FPathToDir := '\System\';
      '.ini': FPathToDir := '\System\';
    else

      ShowMessage('Unbekannte Dateiendung! Bitte ggf. manuell verschieben! Sorry =)');

    end;
Da hab ich jetzt praktisch das so eingestellt, dass die Endung genommen wird und verglichen wird, wonach sich das Zielverzeichnis richtet.

Errors bekomme ich direkt bei dem "case FFileExt of" (FFileExt ist als String deklariert) und der debug besagt "Ordinal type required"
und in Jeder Möglichkeit des Cases kommt die Meldung "Incompatible types: Integer and String" dabei sind das doch beides Strings...

Hängt das vielleicht mit der Änderung der Programmreihenfolge da zusammen?

Würd mich freuen wenn ich dazu noch schnell hilfe bekomme, denn das ist der vorletzte Teil des Programms! :love:

himitsu 20. Sep 2006 13:27

Re: Programm lässt sich nicht beenden
 
CASE kennt nur ordinale Typen ... für Strings geht sowas nicht.

Könntrst ja verschachtelte IFs verwenden

Delphi-Quellcode:
If S = 'abc' Then Begin

End Else If S = 'def' Then Begin

End ....

Zacherl 20. Sep 2006 13:30

Re: Programm lässt sich nicht beenden
 
Oder einfach viele IFs hintereinander:
Delphi-Quellcode:
if s = '1' then
if s = '2' then
...
Was wird denn kopiert? Zufällig UT2004? :mrgreen:

Florian

himitsu 20. Sep 2006 13:35

Re: Programm lässt sich nicht beenden
 
Zitat:

Zitat von Florian Bernd
Oder einfach viele IFs hintereinander

dann werden aber immer alle IFs ausgewerte :zwinker:

luigied 20. Sep 2006 14:04

Re: Programm lässt sich nicht beenden
 
Hi.
Du könntest auch ne prozedur schreiben, die die Dateierweiterung überprüft, nur das sie als Parameter die schon durchsuchten enthält.

Dazu müsstest du die bekannten extensions aber in nem Array speichern.

Delphi-Quellcode:
procedure check(ext: string, Anzahl_der_ueberprüften: integer);
begin
if(!ext = extA(Anzahl_der_ueberprüften) then
  check(ext, Anzahl_der_ueberprüften +1);
else begin
  Verschiebung
  break  // müsste rekursiven Aufstieg verhindern
end;
nicht getestet, aber sollte so in etwa hinhauen

Sorry wenn meine Beiträge etwas sinnlos sind bin aber
1. Anfänger und hab 2. in letzter Zeit kaum noch Zeit für Delphi, da ich beruflich mit
php arbeiten muss :kotz:

Sunlight7 20. Sep 2006 20:15

Re: Programm lässt sich nicht beenden
 
@Radon

Erstelle doch bitte ein neues Thema für Deine 2. Frage.
Die Modis sehen es nicht gerne, wenn pro Thema mehrere Fragen unterschiedlicher Themen gestellt werden.

Radon 22. Sep 2006 17:52

Re: Programm lässt sich nicht beenden
 
Jau, sorry. Dachte das gehört noch irgendwie dazu.

Habs jedenfalls jetzt mit verschachtelten If-Abfragen gelöst und es klappt. Thx!

ArmyMan 20. Jun 2007 22:20

Re: Programm lässt sich nicht beenden
 
Hi @ll

Bin grad auch an einem solchen Problem dran. Und zwar werden optionen von der Registry herausgelesen und falls dann eine Datei nicht existiert sollte die Applikation beendet werden. Bei mir wird eben auch das Close übersprungen.
Gibt es denn keine Andere möglichkeit als im Projekt Source das einzubauen?

Thx & Greetz

Luckie 20. Jun 2007 22:28

Re: Programm lässt sich nicht beenden
 
Wo rufst du Close auf?

ArmyMan 20. Jun 2007 22:32

Re: Programm lässt sich nicht beenden
 
Ich nutze die CoolTrayIcon Kompo und rufe Close in der TrayIconStartup funktion auf.
Diese wird vor der OnCreate der Form aufgerufen.

DP-Maintenance 22. Jun 2007 07:19

DP-Maintenance
 
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.

Luckie 22. Jun 2007 08:56

Re: Programm lässt sich nicht beenden
 
Warum überprüfst du das nicht bevor du deine Anwendung überhaupt startest in der Projektdatei?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz