Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erstellen (https://www.delphipraxis.net/52557-mit-delphi-2005-nonvcl-anwendung-aus-dialogvorlage-erstellen.html)

Thomas233 30. Aug 2005 21:45


Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erstellen
 
Hallo,

ich würde gerne eine NonVCL-Anwendung erstellen die das Anwendungsfenster aus einer Dialogvorlage erstellt.

Ich habe mir deswegen mal Assabards NonVCL-Tutorial angeschaut und bin so ähnlich wie dort beschrieben vorgegangen.

Zuerst starte ich also MS Visual C mit dem ich die Dialogvorlage erstellt habe (als rc-Datei). Dann passte ich die Datei entsprechend an und schmiss den ganzen MFC-Blödsinn raus damit ich die Datei mit dem Ressourcen-Compiler von Delphi entsprechend umwandeln konnte. Folgendes wandelte ich dann auch um (ohne Probleme):
Code:
//main2.rc -> Umgewandelt in main2.res
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

100 DIALOGEX 0, 0, 249, 191
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION |
    WS_SYSMENU
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "Route Installer for Bve"
FONT 8, "Arial"

BEGIN
    CONTROL        "",101,"Static",SS_BLACKFRAME,9,22,109,85
    EDITTEXT       102,128,22,114,57,ES_AUTOHSCROLL | NOT
                    WS_BORDER
    LTEXT          "<AUTHOR>",103,128,86,113,8
    LTEXT          "<URL>",104,128,99,113,8
    CTEXT          "<ROUTE>",105,9,3,233,16
    GROUPBOX       "Setup",106,9,118,231,27
    LTEXT          "<BVE>",107,16,130,134,9
    PUSHBUTTON     "...",108,156,128,16,12
    PUSHBUTTON     "Install now...",109,178,126,58,15
    GROUPBOX       "Installation process",110,9,154,231,26,NOT
                    WS_VISIBLE
    CONTROL        "Progress1",111,"msctls_progress32",
                    NOT WS_VISIBLE | WS_BORDER,15,164,220,11
    PUSHBUTTON     "OK", IDOK, 61, 65, 40, 14
    PUSHBUTTON     "Abrechen", IDCANCEL, 160, 65, 40, 14
END
So, nun öffnete ich Delphi und erstellte eine neue Anwendung, da ich nichts geeignetes für die NonVCL lieh ich mir dazu eine Konsolenanwendung aus und schmiss den ganzen Konsolen-Blödsinn raus.
Daraus entstand dann folgender Programmcode in der DPR-Datei:

Delphi-Quellcode:
program routeinstaller2;

uses
  windows,
  messages;

{$WARNINGS OFF}
{$R main2.res}

var
  hdlg: DWORD = 0;

function dlgfunc(hwnd: hwnd; umsg: dword; wparam: wparam;
 lparam: lparam): bool; stdcall;
begin
  result := true;
  case umsg of
    WM_INITDIALOG:
      begin

      end;
    WM_CLOSE:
      EndDialog(hWnd, 0);
    WM_DESTROY:
      begin
        PostQuitMessage(0);
      end;
    {WM_COMMAND:
      if hiword(wparam) = BN_CLICKED then begin
        case loword(wparam) of
          IDCANCEL,
          IDOK:
            sendmessage(hwnd,WM_CLOSE,0,0);
        end;
      end;}
  else result := false;
  end;
end;

begin
  hdlg := DialogBox(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc);
end.
Trotz einiger Variationen konnte ich nach dem kompilieren & starten der Anwendung kein entsprechendes Anwendungsfenster entdecken, das Programm beendete sich auch gleich nach dem Start ohne mein Zutun.

Liegt es vielleicht am neuen Delphi oder habe ich woanders etwas falsch gemacht ?

Ich wäre euch echt dankbar wenn ihr mir hierbei (wieder mal) helfen könntet.

Vielen Dank !

Mit freundlichen Grüßen,
Thomas Tschofenig

turboPASCAL 30. Aug 2005 22:12

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Zitat:

[...] habe ich woanders etwas falsch gemacht
Code:
[b]begin[/b]
  [color=#ff0000][b]InitCommonControls;[/b][/color]
  hdlg := DialogBox(hInstance, MAKEINTRESOURCE(100), 0, @dlgfunc);
[b]end.[/b]
...nicht vergessen.

Thomas233 30. Aug 2005 22:19

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Delphi-Quellcode:
InitCommonControls;
-> "Undefinierter Bezeichner"

Muss etwa in die uses-Klausel noch was rein ?

Seltsam, seltsam...

Trotzdem danke erstmal !

Mit freundlichen Grüßen,
Thomas

turboPASCAL 30. Aug 2005 22:31

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
InitCommonControls ist in der unit CommCtrl.

// Wass ich noch erklären wollte, so etwas kommt vor wenn du auf dem Dialog Controls erstellt hat, die auf die Common Controls zugreifen z.B. die ProgressBar.

MathiasSimmack 31. Aug 2005 06:34

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Zitat:

Zitat von Thomas233
Zuerst starte ich also MS Visual C mit dem ich die Dialogvorlage erstellt habe (als rc-Datei). Dann passte ich die Datei entsprechend an und schmiss den ganzen MFC-Blödsinn raus damit ich die Datei mit dem Ressourcen-Compiler von Delphi entsprechend umwandeln konnte.

Es gibt eine Batchdatei, die beim Visual Studio 6 dabei ist und evtl. auch bei deiner MS VC-Version dabei sein sollte. Diese Batch ("VcVars32.bat") kannst du starten, und dann kann auch der Compiler von Borland auf den MFC-Blödsinn zugreifen und dein Ressourcenskript kompilieren. :)

Das mache ich so, und ich spare mir damit jede Menge Arbeit, wenn ich das Skript dann doch noch mal im Editor des Visual Studio 6 bearbeiten muss/möchte.

Olli 31. Aug 2005 08:33

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Zitat:

Zitat von MathiasSimmack
Das mache ich so, und ich spare mir damit jede Menge Arbeit, wenn ich das Skript dann doch noch mal im Editor des Visual Studio 6 bearbeiten muss/möchte.

Ich nehme einfach den RC aus dem PSDK ... auch cool, wa? :mrgreen: ... erspart mir die gleiche Arbeit und das Starten besagter Batchdatei :zwinker:

@Thomas233: Nimm mal lieber Luckies Tutorials. Meins ist so veraltet und existiert auch nur noch, weil ich zu faul war es zu entfernen :lol: ...
Auf die Common Controls bin ich ja garnicht eingegangen. Übrigens, wenn man ein Richedit benutzt, muß man auch vorher eine DLL laden (je nach Richedit-Version) ;) ;)

Thomas233 31. Aug 2005 11:33

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Hallo,

ah, deswegen. Danke.

Das mit dem Ressourcen-Skript ist kein Problem, ich schmeisse einfach nach jeder Änderung das MFC-Zeug raus, ist kein besonderer Aufwand. Ich behalte die rc-Datei ausserdem ja eh für spätere Änderungen.

@MathisSimmack:
Hmm..kann mir eigentlich auch noch vorstellen das da irgendwas gekürtzt wird (bzw. die Verweise auf die Header geändert werden), denn was sollte Delphi mit der MFC anfangen ? Oder liege ich da falsch ?

@Olli:
Ach deswegen wollt`s so nicht ;-)

@turboPascal:
Danke !

Hab da gleich wieder drei Fragen:
1) Kann man den Dialog irgendwie einfärben (im Skript oder nachträglich)?
2) Wenn ich Text darstellen möchte, was eignet sich dann am besten dafür ? Ich hab ein Edit genommen, ist aber nicht die optimale Lösung weil da keine Zeilenümbrüche gehen. Ein Memo wäre da optimal (ich mag aber jetzt nicht extra deswegen eines entwickeln *g*
3) Ich möchte nachträglich ein Bitmap auf dem Dialog anzeigen (in einem bestimmten Bereich. Momentan habe ich deswegen ein Bild-Control aus MS VC genommen und es auf dem Dialog platziert (leer gelassen). Könnte es so funktionieren oder gäbe es eine bessere Lösung ?

Bin mit NonVcl leider noch nicht so vertraut.

Vielen Dank im Vorraus !

Liebe Grüße,
Thomas

Flocke 31. Aug 2005 12:07

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Zitat:

Zitat von Thomas233
1) Kann man den Dialog irgendwie einfärben (im Skript oder nachträglich)?

Du kannst WM_ERASEBKGND abfangen, den Dialog zeichnen und dann TRUE zurückgeben. Ist aber nicht ganz trivial weil dann ggf. die 3D-Ränder nicht mehr passen - schau' dir dazu auch WM_GETCTLCOLOR an.

Zitat:

Zitat von Thomas233
2) Wenn ich Text darstellen möchte, was eignet sich dann am besten dafür ? Ich hab ein Edit genommen, ist aber nicht die optimale Lösung weil da keine Zeilenümbrüche gehen. Ein Memo wäre da optimal (ich mag aber jetzt nicht extra deswegen eines entwickeln *g*

Ein EDIT kann auch mehrere Zeilen, du musst nur ES_MULTILINE setzen.

Zitat:

Zitat von Thomas233
3) Ich möchte nachträglich ein Bitmap auf dem Dialog anzeigen (in einem bestimmten Bereich. Momentan habe ich deswegen ein Bild-Control aus MS VC genommen und es auf dem Dialog platziert (leer gelassen). Könnte es so funktionieren oder gäbe es eine bessere Lösung ?

Soweit ich weiß gibt's für STATIC ein SS_BITMAP - da kann man direkt über den Namen eine Bitmap-Ressource einbinden.

Thomas233 31. Aug 2005 13:55

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Zitat:

Du kannst WM_ERASEBKGND abfangen, den Dialog zeichnen und dann TRUE zurückgeben. Ist aber nicht ganz trivial weil dann ggf. die 3D-Ränder nicht mehr passen - schau' dir dazu auch WM_GETCTLCOLOR an.
Ok, wird gemacht.

Zitat:

Ein EDIT kann auch mehrere Zeilen, du musst nur ES_MULTILINE setzen.
Achso. Muss ich das bereits im Visual C Editor machen ? Welches Zeichen wird dann als Zeichenumbruch verwendet ?

Zitat:

Soweit ich weiß gibt's für STATIC ein SS_BITMAP - da kann man direkt über den Namen eine Bitmap-Ressource einbinden.
Lässt sich das Bitmap auch nachträglich (mit Delphi) irgenwie laden ? Es steht nähmlich erst zur Laufzeit fest was da geladen werden sollte...

Vielen Dank Volker !

Mit freundlichen Grüßen,
Thomas Tschofenig

Flocke 31. Aug 2005 14:04

Re: Mit Delphi 2005 NonVCL-Anwendung aus Dialogvorlage erste
 
Zitat:

Zitat von Thomas233
Zitat:

Ein EDIT kann auch mehrere Zeilen, du musst nur ES_MULTILINE setzen.
Achso. Muss ich das bereits im Visual C Editor machen ?

Genau.

Zitat:

Zitat von Thomas233
Welches Zeichen wird dann als Zeichenumbruch verwendet ?

Normal: CR/LF bzw. #13#10. Wenn du KEINEN horizontalen Scrollbalken angibst, dann sollte der Text auch automatisch umgebrochen werden.

Nachtrag: direkt im Resource-Skript allerdings "\r\n" (C-Notation)

Zitat:

Zitat von Thomas233
Zitat:

Soweit ich weiß gibt's für STATIC ein SS_BITMAP - da kann man direkt über den Namen eine Bitmap-Ressource einbinden.
Lässt sich das Bitmap auch nachträglich (mit Delphi) irgenwie laden ? Es steht nähmlich erst zur Laufzeit fest was da geladen werden sollte...

Du lädst die Bitmap mit LoadBitmap oder LoadImage und schickst sie dann an das Control:
Delphi-Quellcode:
SendDlgItemMessage(hDlg, 123, STM_SETIMAGE, IMAGE_BITMAP, hBitmap);
- hDlg = Fensterhandle des Dialogs
- 123 = ID des Static-Controls
- hBitmap = Bitmap-Handle, Rückgabewert von LoadBitmap/LoadImage
Macht man normalerweise bei WM_INITDIALOG.

Ich denke, dass man für die Ressourcenverwaltung dann selbst zuständig bist (also abschließend ein DeleteObject mit dem Handle machen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:30 Uhr.
Seite 1 von 2  1 2      

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