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 Ich krieg das Handle von abgeleitetem Edit nicht! (https://www.delphipraxis.net/50986-ich-krieg-das-handle-von-abgeleitetem-edit-nicht.html)

Red six 3. Aug 2005 22:26


Ich krieg das Handle von abgeleitetem Edit nicht!
 
Tag Leute,


Ich bin der Neue :shock: Hab aber schon viele sehr hilfreiche Infos in diesem Board gefunden. Danke dazu erstmal :dp:


Ich bin grade dabei mir n paar schön runde Komponenten zu basteln und hab mal mit TEdit angefangen. Dazu muss ich erstmal sagen dass ich nur sehr wenig Ahnung von OOP hab. Naja also hab ich die Klasse TRoundEdit erstellt und zu anfang gleich bemerkt dass TEdit scheinbar kein Canvas unterstüzt. :mrgreen: Also hab ichs halt selber gemacht:

Delphi-Quellcode:
Canvas: TCanvas;

begin
Canvas := TCanvas.Create;
Canvas.Handle := GetDC(TRoundEdit.Handle);
end;
Tja und da liegt auch mein Problem, meine Klasse will die Device Control (das heißt doch so oder? :lol: ) nicht rausrücken... Also meine Klasse hat garkeine property Handle. Hab dann gleich mal nachgeschaut obs bei Edit1.Handle geht, das ging. Also hab ich mir gedacht dass Handles vlt nur bei Objekten, nicht aber bei Klassen vorhanden sind. Das wär allerdings sehr komisch, ich mein wie sollte man dann jemals was weiterentwickeln an den klassen :gruebel:

Also könnte mir plz schnell (will weitermachen :stupid: ) jemand verraten was ich falsch mach? Danke schonmal!




mfg,

:wiejetzt:


Red six


EDIT:


Oh oh sorry,

komisch ich war mir sicher den richtigen Bereich angeklickt zu haben :oops:

Naja plz move :angel:

SirThornberry 3. Aug 2005 22:32

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
anstelle von "TRoundEdit.Handle" musst du "Self.Handle" schreiben. Denn du willst ja das handle von der instanz.

Red six 3. Aug 2005 22:36

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
Ah vielen dank :thumb:



Red

SirThornberry 3. Aug 2005 22:49

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
eventuell verhält es sich mit der Canvas genau so, probier einfach mal ob es innerhalb der Komponente Self.Canvas gibt.

Red six 3. Aug 2005 22:53

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
Mh leider nein :?

Im moment hab ich aber ein anderes problem mit den Handles...

Achtung ich zeig mal den Code (lacht ja nicht ich mach sowas zum ersten mal)

Delphi-Quellcode:
constructor TRoundEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Self.Ctl3D := False;

  Canvas := TCanvas.Create;
  Canvas.Handle := GetDC(Self.Handle);
end;

procedure TRoundEdit.Paint;
begin
  Canvas.RoundRect(Self.Left, Self.Top, Self.Width, Self.Height, 10, 10);
end;
Ist viel falsch?

Was bewegt da den Compiler dazu "Element hat kein übergeordnetes fenster" auszugeben? Ich hab hier mal gesucht und nen Thread von 2003 gefunden (den ich nicht wieder ausgraben wollte) und dort war auch das Problem irgentwie ein anderes... Naja...

Red

SirThornberry 3. Aug 2005 22:59

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
das problem ist das im Create noch kein Parent zugewiesen ist und daher auch der Fehler.
Ich tippe mal der Fehler kommt bei "Self.Ctl3D := False;" Führe diesen teil also erst aus wenn ein Parent zugewiesen ist.

Red six 3. Aug 2005 23:03

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
Mh daran liegts leider nicht :wiejetzt:

Flocke 4. Aug 2005 07:07

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
Zitat:

Zitat von Red six
Im moment hab ich aber ein anderes problem mit den Handles...

Achtung ich zeig mal den Code (lacht ja nicht ich mach sowas zum ersten mal)

Delphi-Quellcode:
constructor TRoundEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Self.Ctl3D := False;

  Canvas := TCanvas.Create;
  Canvas.Handle := GetDC(Self.Handle);
end;

procedure TRoundEdit.Paint;
begin
  Canvas.RoundRect(Self.Left, Self.Top, Self.Width, Self.Height, 10, 10);
end;

Nur mal so ein paar Stichworte:

1. Dein Control ist von TEdit abgeleitet, das heißt, du bekommst alle "vererbten" Eigenschaften und Methoden mit dem Schlüsselwort inherited und nicht (wie du oben mal geschrieben hast), indem du "TRoundEdit." davor schreibst. Das "Self." davor kannst du auch weglassen.

2. Einen Canvas holt man sich nur, wenn man auch wirklich zeichnen will, und nicht schon vorher. Eben weil da ein HDC als Handle drin ist und das nicht ewig hält.

3. Du zeichnest nur dich, ggf. willst du danach auch noch das Edit-Control zeichnen mit "inherited Paint;"

4. Ein TEdit basiert auf einem nativen Windows-Control. Da ist das Ableiten schwieriger als bei einer reinen Delphi-Komponente. Manche Dinge, die du vielleicht im Sinn hast, gehen eventuell überhaupt nicht bzw. lassen sich nicht verändern.

Zitat:

Zitat von Red six
Was bewegt da den Compiler dazu "Element hat kein übergeordnetes fenster" auszugeben? Ich hab hier mal gesucht und nen Thread von 2003 gefunden (den ich nicht wieder ausgraben wollte) und dort war auch das Problem irgentwie ein anderes... Naja...

Ist das wirklich eine "Compilermeldung" oder eine Fehlermeldung während der Laufzeit auf?
In welcher Zeile tritt der Fehler auf?
Wie erzeugst du dein Control?

Red six 4. Aug 2005 15:56

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
Ok danke für deine Antwort!

Alsooo...

1) versteh ich nicht ganz was du meinst :gruebel:
2) Ok ich habs in die prozedur Paint gesteckt
3) inherited Paint geht leider nicht ("Undefinierter Bezeichner: 'Paint'") Kanns sein dass die Prozedur da anders heißt?
4) Mh also im moment hab ich blos ein normales editfeld, rund is da leider noch nix :( (Liegt demnach an obigen problem)
5) Ok sorry stimmt hab mich falsch ausgedrückt, es war ein Laufzeitfehler, wobei dieser mittlerweile auch beseitigt ist! :stupid:

Delphi-Quellcode:
 
rnd := TRoundEdit.Create(MainForm);
rnd.Parent := MainForm;
rnd.Left := 10;
rnd.Top := 10;
Delphi-Quellcode:
constructor TRoundEdit.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  self.Ctl3D := False;
end;

procedure TRoundEdit.Paint;
begin
  //inherited Paint;

  Canvas := TCanvas.Create;
  Canvas.Handle := GetDC(Handle);
  Canvas.RoundRect(Self.Left, Self.Top, Self.Width, 20, 10, 10);
  Canvas.Free; //das gleich hier rein?
end;


Red

Flocke 4. Aug 2005 16:59

Re: Ich krieg das Handle von abgeleitetem Edit nicht!
 
Zitat:

Zitat von Red six
1) versteh ich nicht ganz was du meinst :gruebel:

Deine Deklaration von TRoundEdit sieht so aus:
Delphi-Quellcode:
type
  TRoundEdit = class(TEdit)
    // bla bla bla
  end;
Dann kommst du an alles was du redefinierst über inherited xyz dran, hast du ja bei "inherited Paint;" schon versucht.

Zur 3) Ein Edit-Control kennt die Methode "Paint" nicht, weil Delphi hier nichts selbst zeichnet sondern das Control das macht (hatte ich oben unter 4 schon angedeutet). Du musst dann die Prozedur "PaintWindow" abfangen (musst du mal in Controls.pas nachsehen was die macht) oder noch eher die Meldung WM_PAINT.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 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