![]() |
Element hat kein übergeordnetes Fenster #34
Liste der Anhänge anzeigen (Anzahl: 1)
So, ich muss nochmal nerven :>
Ich hab mir jetzt ne Komponente gebastelt, die von TShellListView abgeleitet ist; die "TUltiShellListView" :mrgreen: Ich hab versucht, sie mit der Drag&Drop-Funktionalität auszustatten, klappt auch bisher recht gut :) Ich papp also die Kompo auf die Form, lass das (Test-)Projekt laufen und alles funktioniert wunderbar. Wenn ich dann allerdings das Programm schließ, krieg ich folgendes: Zitat:
Zitat:
Zitat:
Zitat:
Ich hab die Kompo mal angehängt, Benutzung auf eigene Gefahr :mrgreen: Ach ja, wenn ich ich die EXE ohne Delphi starte, kommt beim Beenden das hier: Zitat:
Ich hoff, ihr könnt mir helfen :) |
Re: Element hat kein übergeordnetes Fenster #34
Moin Julian,
[dp]Element hat kein übergeordnetes Fenster[/dp] da gibt es schon einige Fundstellen zum Thema. Ggf. findest Du direkt weiterführendes unter ![]() |
Re: Element hat kein übergeordnetes Fenster #34
Hallo,
Delphi-Quellcode:
constructor TUltiShellListView.Create(aOwner: TComponent);
begin inherited Create(aOwner); // Parent := aOwner as TWinControl; // <- kommentiere diese Zeile bitte aus DragAcceptFiles(self.handle, True); end; |
Re: Element hat kein übergeordnetes Fenster #34
Hi Christian, hi Jens^^
@Christian: Hm, bisher hat das was ich so gefunden hab auch nicht funktioniert *gg* Aber ich schau noch weiter :) @Jens: Das bringt leider nur insofern was, dass ich nun schon die Meldung Zitat:
Das, was mich am meisten stutzig macht, ist, dass die gesamte IDE verrückt zu spielen scheint :-| //edit: Hab das ganze nun mal so umgeschrieben:
Delphi-Quellcode:
Nun bekomm ich zweimal die Meldung mit dem Namen des Parents; einmal, wenn ich die Kompo auf die Form platziere, und einmal, wenn ich das Projekt kompiliere und starte.
constructor TUltiShellListView.Create(aOwner: TComponent);
begin inherited Create(aOwner); //Parent := aOwner as TWinControl; end; procedure TUltiShellListView.CreateWnd; begin inherited; if parent <> nil then begin DragAcceptFiles(self.handle, True); MessageBox(0, PChar(parent.Name), 'Parent', MB_OK); end else MessageBox(0, 'Kein Parent!', 'Caption', MB_OK); end; Aber wieso kommt dann wenn ich das Prog beende die EInvalidOperation-Exception, dass das Element kein übergeordnetes Fenster hätte? :shock: Funzt übrigens weder in D7 PE noch in D2005 PE... |
Re: Element hat kein übergeordnetes Fenster #34
Lass mal in CreateWnd die Überprüfung auf Parent weg. Wenn Du die Komponente aus der IDE auf das Form ziehst, wird automatisch der Parent gesetzt, ist also da. Wenn Du bei einer dynamischen Erzeugung vergisst, den Parent zu setzen, wird CreateWnd nicht aufgerufen.
Und dann: entferne aus Destroy den erneuten Aufruf von DragAcceptFiles. Wenn überhaupt gehört der nach DestroyWnd. Bei mir kommen so zumindest keine Fehler mehr wg. des übergeordneten Fensters. Gruß, teebee |
Re: Element hat kein übergeordnetes Fenster #34
teebee, du bist hiermit ab sofort offiziell der Held meines Abends :mrgeen:
Es funktioniert alles perfekt, so wies soll :) Aber ich muss sagen, dass ich das zweite DragAcceptFiles (Parameter "false) einbringen muss, denn sonst wird das ja nicht mehr zurückgesetzt, wenn ichs im CreateWnd mit Parameter "true" aufrufe. Man will ja schließlich sauber programmieren ;) Danke nochmal an alle, die helfen wollten :) Was sich mir aber dennnoch für ne Frage stellt: Wieso lässt sowas die IDE "kaputt gehen"? :shock: |
Re: Element hat kein übergeordnetes Fenster #34
Hallo Ultimator,
mir ist noch eine Kleinigkeit aufgefallen: Es fehlt der Aufruf von DragFinish am Ende der Methode. Da im EventHandler etwas schief gehen könnte sollte es innerhalb eines Resourceschutzblockes stehen.
Delphi-Quellcode:
procedure TUltiShellListView.WMDropFiles(var Message: TWMDropFiles);
var Count: Integer; I: Integer; Buffer: array[0..MAX_PATH] of Char; Temp : TStringList; begin Temp := TStringList.Create; Try Count := DragQueryFile(Message.Drop, UINT(-1), nil, 0); for I := 0 to Count - 1 do begin DragQueryFile(Message.Drop, I, @Buffer, SizeOf(Buffer)); Temp.Add(Buffer); end; OnGetFiles(Temp); Finally DragFinish(Message.WParam); Temp.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:39 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