Autor Beitrag
Ruditschka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: So 18.04.04 13:03 
Hallo zusammen!

Ich bin gerade dabei mich in die nonVCL-Programmierung ein bisschen einzuarbeiten.
Dabei stoße ich auf folgendes Problem/Frage:

Wenn ich mit der VCL Objekte dynamisch bzw. im selbst im Quellcode erstelle, so sollte ich diese am Ende auch wieder selber freigeben. Wenn ich das nicht mache, gibt die als Parent angegebene Form das Objekt wieder frei. Geht auch, ist aber wohl kein guter OOP-Stil.

Bei der nonVCL-Programmierung habe ich bisher nur die Funktion CreateWindow(Ex) gefunden um damit ein Fenster zu erstellen. Muss ich Objekte/Fenster bei der nonVCL-Programmierung am Ende nicht wieder explizit freigeben/löschen?

Dabei kommt mir direkt die nächste Frage: Wie kann ich Objekte/Fenster zur Laufzeit entfernen (z.B. Images - Das Image ienfach ausblenden und den Rest der Zeit im Speicher lassen ist nicht wirklich toll)?

Christoph
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: So 18.04.04 14:15 
Grundsätzlich solltest du alles was du im Code erstellst, gerade via API Funktionen auch wieder freigeben. Leider macht das meistens keiner sonst für dich.

grez
msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: So 18.04.04 15:29 
Mit welcher API-Funktion gebe ich meine Objekte/Fenster wieder frei?

Was passiert wenn ich das nicht tue?
Beispiel:
Ich erstelle mit CreateWindowEx ein einfaches Fenster und erstelle beim Empfang von WM_CREATE einen Button. Auf WM_DESTROY antworte ich nur mit PostQuitMessage(0). Erstelle ich damit einen wunderbaren Speicherwurm oder gibt die Win-API die beiden Fenster wieder frei?
Stark verinfacht wäre das dann folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall;
begin
  case uMsg of
    WM_CREATE:
      begin
      hwndButton := CreateWindowEx(0, 'BUTTON', 'Test', WS_VISIBLE or WS_CHILD,
        20, 20, 100, 25, hWnd, IDC_BTN_TEST, hInstance, nil);
      end;
    WM_DESTROY:
      begin

      // Code zum freigeben des Buttons (???)

      PostQuitMessage(0);
      end;
  end; { case }
end;




Gruß
Christoph
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 18.04.04 16:41 
Im Prinzip reicht es, das Hauptfenster mit "DestroyWindow" freizugeben, denn
PSDK hat folgendes geschrieben:
If the specified window is a parent or owner window, DestroyWindow automatically destroys the associated child or owned windows when it destroys the parent or owner window. The function first destroys child or owned windows, and then it destroys the parent or owner window.
Ruditschka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 66



BeitragVerfasst: Mi 21.04.04 09:27 
Sorry für die späte Rückmeldung.

Besten Dank für die Antwort. So etwas hab ich gesucht.

Gruß
Christoph