Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Die Delphi-IDE (https://www.delphipraxis.net/62-die-delphi-ide/)
-   -   Mainform über .dProj - Datei auslesbar? (https://www.delphipraxis.net/198433-mainform-ueber-dproj-datei-auslesbar.html)

Harry Stahl 1. Nov 2018 19:00

Mainform über .dProj - Datei auslesbar?
 
Kann man über die Delphi .dproj-Datei rausfinden, welche Form die Mainform ist (und die dazugehörige Datei)?

Ich habe da leider nichts eindeutiges gefunden.

Bleibt nichts anderes, als die DPR-Datei auszulesen, den ersten Eintrag finden, wo Appilcation.CreateForm (ClassName) aufgerufen wird, alle anderen .pas Dateien öffnen und nach dem Klassen-Objekt suchen?

Wäre schön, wenn es über die .Dproj ginge.

Hintergrund:

Wenn ich ein Delphi-Projekt über meinen Pascal-Editor-Programm öffne, möchte ich neben der DPR-Datei direkt automatisch die Datei des Hauptformulars (.pas) öffnen.

EWeiss 1. Nov 2018 19:12

AW: Mainform über .dProj - Datei auslesbar?
 
Bei mir steht
Zitat:

<DCCReference Include="_main\uMain.pas"/>
Nun wenn ich weis das diese *.pas die MainUnit ist, ist das kein Problem.
Aber ich befürchte nur anhand vom Namen der Unit wird das wohl nix.

Denn wenn du fremd Projekte hast und den Namen nicht kennst oder dieser nicht vorgegeben ist dann stehst du auf dem Schlauch.

Mit der *.dpr wird das auch nix.
Delphi-Quellcode:
program Mixer64;

uses
  SKAeroAPI in '_api\SKAeroAPI.pas',
  uMain in '_main\uMain.pas',
  uGlobal in '_unit\uGlobal.pas',
  uControls in '_main\uControls.pas',
Wie willst du jetzt feststellen was die Mainform ist?
Bei mir gibt es kein Appilcation.CreateForm für deine Projekte mag das funktionieren aber nicht für alle.

Nur!
Delphi-Quellcode:
begin
  WinMain(hInstance, 0, nil, 0);
gruss

Harry Stahl 1. Nov 2018 19:22

AW: Mainform über .dProj - Datei auslesbar?
 
Wenn Du ein Projekt hast, wo es kein Application.createform gibt, dann steht aber auch kein Eintrag in der Ansicht, Projekte, Optionen, Formulare, das ist doch richtig, oder?

Was ist dann bei Dir die Mainform?

Die erste Form, die in der DPR-Datei erzeugt wird?

EWeiss 1. Nov 2018 19:26

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

Zitat von Harry Stahl (Beitrag 1417271)
Wenn Du ein Projekt hast, wo es kein Application.createform gibt, dann steht aber auch kein Eintrag in der Ansicht, Projekte, Optionen, Formulare, das ist doch richtig, oder?

Was ist dann bei Dir die Mainform?

Die erste Form, die in der DPR-Datei erzeugt wird?

Korrekt!

Das wäre die Form in der die Function WinMain aufgerufen wird.
Die Position der Unit in der .dpr ist dabei egal.

gruss

Schokohase 1. Nov 2018 20:02

AW: Mainform über .dProj - Datei auslesbar?
 
Wenn es darum geht, diejenige Form herauszusuchen, die bei den Projektoptionen im Bereich Formulare als Hauptformular festgelegt ist, dann kann man nur die *.dpr analysieren und den ersten Eintrag mit
Delphi-Quellcode:
Application.CreateForm()
lokalisieren.

Denn exakt so macht das die IDE auch.

Kann man ganz leicht herausfinden, indem man die Reihenfolge in der *.dpr mal tauscht und dann in den Projektoptionen sich den EIntrag bei Hauptformular anschaut.

EWeiss 1. Nov 2018 20:03

AW: Mainform über .dProj - Datei auslesbar?
 
Wie du vielleicht schon gelesen hast gibt es das nicht in jeden Projekt dein Application.CreateForm()

gruss

Schokohase 1. Nov 2018 20:05

AW: Mainform über .dProj - Datei auslesbar?
 
Wie du vielleicht schon gelesen hast spreche ich über diese Art der Delphi-Anwendungen gar nicht.

Zitat:

Zitat von Schokohase (Beitrag 1417277)
Wenn es darum geht, diejenige Form herauszusuchen, die bei den Projektoptionen im Bereich Formulare als Hauptformular festgelegt ist,


EWeiss 1. Nov 2018 20:07

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

Wenn es darum geht, diejenige Form herauszusuchen, die bei den Projektoptionen im Bereich Formulare als Hauptformular festgelegt ist,
Nun gut in dem Fall..

gruss

Schokohase 1. Nov 2018 20:18

AW: Mainform über .dProj - Datei auslesbar?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also ich spreche davon wie man an diese Form1 (siehe jetzt das Bild)
Anhang 50192
kommt. Dafür gibt es eine Regel wo diese im Quelltext zu finden ist. Für die anderen Möglichkeiten gibt es keine Regel, das kann sonst wo stehen und ist darum nicht so einfach aus dem Quelltext herauszufiltern.

EWeiss 1. Nov 2018 20:21

AW: Mainform über .dProj - Datei auslesbar?
 
Deshalb habe ich Harry darauf aufmerksam gemacht das es NICHT immer geht..
Wenn es im speziellen NUR um MainFormen im Bereich Formulare der Hauptformular geht hast du natürlich recht.

EDIT:
Du hast doch verschiedene Einstellungen in deinem Projekt.
Kannst du da nicht explizit die MainForm vom jeweiligen Projekt angeben und diese dann starten?
Das macht man einmal und gut ist.

gruss

Harry Stahl 1. Nov 2018 21:15

AW: Mainform über .dProj - Datei auslesbar?
 
Das mit dem Auslesen der .dpr-Datei funktioniert ganz gut.

@EWeiss Wie sieht so ein Aufruf mit WinMain aus?

Hast Du da überhaupt klassische Formulare (.dfm-Dateien)?

mkinzler 1. Nov 2018 21:23

AW: Mainform über .dProj - Datei auslesbar?
 
Eine dProj ist ja kein Ersatz sondern eine Erweiterung für die dpr-Datei.

Uwe Raabe 1. Nov 2018 21:30

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

Zitat von Harry Stahl (Beitrag 1417285)
Das mit dem Auslesen der .dpr-Datei funktioniert ganz gut.

Würde aber bei einigen meiner Programme nicht funktionieren - einfach weil das MainForm programmatisch bestimmt wird. In der DPR wird gar kein Form erzeugt und daher in den Projekt-Optionen auch kein Hauptformular angezeigt. Das ist besonders dann hilfreich, wenn je nach aktueller Umgebung oder Konfiguration unterschiedliche Formulare zum Hauptformular werden sollen. Dein Tool sollte also auch diesen Fall erlauben.

Siehe auch hier: https://stackoverflow.com/questions/.../383197#383197

Harry Stahl 1. Nov 2018 21:40

AW: Mainform über .dProj - Datei auslesbar?
 
@Uwe: OK, wenn das zur Laufzeit entschieden wird, kann ich eh nichts machen. Dann wird eben keine "Mainform" gefunden und der User muss halt per Doppelklick auf eine der Dateien in der Projektliste entscheiden, welche Datei er laden möchte.

Ich wollte diese Funktion hier im Programm ergänzen, weil ich festgestellt habe, dass ich sehr oft etwas in der Mainform suche, da macht es Sinn, diese automatisch zu öffnen, spart mir wieder ein paar Klicks (kann man natürlich Optional an oder ausschalten)...

EWeiss 2. Nov 2018 08:46

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

@EWeiss Wie sieht so ein Aufruf mit WinMain aus?
Hast Du da überhaupt klassische Formulare (.dfm-Dateien)?
Nein nur dann wenn ich es explizit wünsche.
Die meiner Drawing64 Anwendung, ist quasi vom Aufbau fast immer gleich.

Delphi-Quellcode:
function WinMain(hInstance: HINST; hPrevInstance: HINST; lpCmdLine: PChar; nCmdShow: integer)
  : integer; stdcall;

var
  Msg: TMsg;
  myClass: PWideChar;
  myTitle: PWideChar;
  dwStyle: DWORD;
  wc: TWndClassEx;
  X: integer;
  Y: integer;
  IsInitialized: Bool;
  rc: TRect;
  Path: string;

begin

  myClass := 'POPUPWINDOW';

  wc.cbSize := SIZEOF(wc);
  IsInitialized := GetClassInfoEx(hInstance, myClass, wc);
  if IsInitialized = False then
  begin
    wc.cbSize := SIZEOF(wc);
    wc.style := CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS;
    wc.lpfnWndProc := @WndProc;
    wc.cbClsExtra := 0;
    wc.cbWndExtra := EXTEND_EXTRA * 4;
    wc.hInstance := hInstance;
    wc.hIcon := 0;
    wc.hCursor := LoadCursor(0, IDC_ARROW);
    wc.hbrBackground := 0;
    wc.lpszMenuName := nil;
    wc.lpszClassName := myClass;
    wc.hIconSm := wc.hIcon;

    if RegisterClassEx(wc) <> 0 then
      IsInitialized := True;
  end;

  if IsInitialized then
  begin

    dwExStyle := 0;
    dwStyle := WS_POPUP;

    SetRect(rc, 0, 0, XMIN_SIZE, YMIN_SIZE);
    AdjustWindowRectEx(rc, dwStyle, False, dwExStyle);

    X := MAX((GetSystemMetrics(SM_CXSCREEN) - rc.Right - rc.left) div 2, 0);
    Y := MAX((GetSystemMetrics(SM_CYSCREEN) - rc.Bottom - rc.Top) div 2, 0);

    // Create The Window
    myTitle := 'Drawing64';
    MainHandle := CreateWindowEx(dwExStyle, myClass, // Classen Name
      myTitle, // Window Titel
      dwStyle, // Definierte Window Style
      X, Y, // Windows Position
      rc.Right - rc.left, // Windows Weite
      rc.Bottom - rc.Top, // Windows Höhe
      0, // Kein Parent Window
      0, // Kein Menu
      wc.hInstance, // Instance
      nil); // Nichts zu WM_CREATE hinzufügen

    if MainHandle <> 0 then
    begin
      // Flag zum Neustarten wenn Skin geändert wurde
      Restart := False;

      UserAppDataDir := GetSpecialFolder(CSIDL_APPDATA);

      // Direktory erstellen wenn nicht vorhanden
      if not ForceDirectories(UserAppDataDir + '\BrewIdeas\Drawing64') then
      begin
        raise Exception.Create('Cannot create' + UserAppDataDir + '\BrewIdeas\Drawing64');
        Halt;
      end;

      Path := UserAppDataDir + '\BrewIdeas\Drawing64\';

      InitPath;
      DefSkin := DrawingIni.ReadString('SkinPath', 'Skin', ExtractFilePath(ParamStr(0))
          + 'Skins\Blue\Drawing64.ske');
      DrawingIni.Free;

      // Skin Initialisieren und einstellungen laden
      SKAERO_InitSkin(MainHandle, DefSkin, True, True);

      AddChildControls(MainHandle, wc.hInstance);

      // Ini laden
      LoadIni;

      // Window Anzeigen
      SKAERO_ShowMainWindow(MainHandle, 5);

      // Emuliert Aero in WinXP wenn in der Ini aktiviert
      if SKAERO_AEROEMULATE <> 0 then
        SetTimer(MainHandle, SKAERO_AERO_TIMER, SKAERO_AEROTIMERDELAY, nil);

      SetTimer(MainHandle, DRAWING_TIMER, 0, nil);

      // Windows Messagen verarbeiten
      while GetMessage(Msg, 0, 0, 0) do
      begin
        if IsDialogMessage(MainHandle, Msg) = False then
        begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;
      end;

      // Falls aktiviert Timer beenden
      if SKAERO_AEROEMULATE <> 0 then
        KillTimer(MainHandle, SKAERO_AERO_TIMER);

      SKAERO_Free;

    end; // end WinHandle
  end
  else
    UnRegisterClass(wc.lpszClassName, hInstance);

  if Restart then
    Result := ShellExecute(0, 'open', PWideChar(ParamStr(0)), nil, nil, SW_SHOW)
  else
    Result := Msg.WParam;

end;
{$ENDREGION}
gruss

dummzeuch 2. Nov 2018 09:57

AW: Mainform über .dProj - Datei auslesbar?
 
Eigentlich ist das doch OK, wenn Harry's Programm genauso funktioniert (oder nicht funktioniert) wie die IDE. Wenn es kein Application.CreateForm in der .DPR gibt, kann die IDE das Hauptformular auch nicht angeben (wenn man eines auswählt, fügt die IDE (gerne auch mal falschen) Code (gerne auch an der falschen Stelle) ein.

EWeiss 2. Nov 2018 09:59

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

Eigentlich ist das doch OK, wenn Harry's Programm genauso funktioniert (oder nicht funktioniert) wie die IDE.
Dem widerspricht niemand.
Er hat mich gefragt und ich habe geantwortet ;)

gruss

Uwe Raabe 2. Nov 2018 11:06

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

Zitat von dummzeuch (Beitrag 1417302)
Eigentlich ist das doch OK, wenn Harry's Programm genauso funktioniert (oder nicht funktioniert) wie die IDE.

Das ist sogar vollkommen OK. Mein Einwand bezog sich eher darauf, daß es auch andere Fälle gibt, die zumindest zulässig bleiben sollten.

Harry Stahl 2. Nov 2018 11:22

AW: Mainform über .dProj - Datei auslesbar?
 
Zitat:

Zitat von EWeiss (Beitrag 1417303)
Zitat:

Eigentlich ist das doch OK, wenn Harry's Programm genauso funktioniert (oder nicht funktioniert) wie die IDE.
Dem widerspricht niemand.
Er hat mich gefragt und ich habe geantwortet ;)

gruss

Und danke für die Antwort.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:01 Uhr.

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