Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TCollection = not TCollection ? (https://www.delphipraxis.net/161506-tcollection-%3D-not-tcollection.html)

Medium 6. Jul 2011 21:08

AW: TCollection = not TCollection ?
 
"self" ist auch nur ein Pointer auf die aktuelle Instanz, im eigenen Adressraum. Für die DLL ist das, bestenfalls, ungültiger Speicher, oder eben zufällige Daten im Irgendwo.

EWeiss 6. Jul 2011 21:21

AW: TCollection = not TCollection ?
 
Zitat:

Zitat von Medium (Beitrag 1110433)
"self" ist auch nur ein Pointer auf die aktuelle Instanz, im eigenen Adressraum. Für die DLL ist das, bestenfalls, ungültiger Speicher, oder eben zufällige Daten im Irgendwo.

Ist so auch nicht richtig..
Wenn ich self übergebe habe ich ja das gültige Handle der Anwendung aber nicht die Komponenten dieser.

Und sag mir nicht das wäre jetzt irgendein handle..
Die kann ich schon vergleichen :)

Ich glaube da muss ich langsam passen
Oder aber die Komponenten direkt übergeben wie bei der Scrollbar wenn es anders nicht geht.
Das gleich in VB sind 4 Zeilen dann habe ich alles was ich brauche.

Übersetzung von Delphi nach VB

Code:
Public Property Get ParentObj() As Object

Dim TempObj As Object

    If m_ParentObj = 0 Then
        Set ParentObj = Nothing
    Else
        CopyMemory TempObj , m_ParentObj, 4
        Set ParentObj = TempObj
        CopyMemory TempObj, 0, 4
    End If

End Property
Und schon habe ich zugriff auf alle Objekte die sich auf der Form befinden.
Warum ist das nur sooooo kompliziert in Delphi.

PS:
Aber wir kommen vom Thema ab. ;)

gruss

EWeiss 6. Jul 2011 21:44

AW: TCollection = not TCollection ?
 
sorry push..

Bei der Übergabe der Combobox direkt funktioniert es aber ich will alle gleichzeitig verarbeiten können.

Warum geht das nicht?

Das will ich vermeiden

Delphi-Quellcode:
  ComboHook := HookedCombo_Create;
  if assigned(ComboHook) then
  begin
    ComboHook.ComboImg := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Combo.png');
    ComboHook.FrameColor := $FCAC65;
    ComboHook.FrameHighLite := $FFE9D6;

    ComboHook.SetComboParentObj(ComboBox1);
    ComboHook.Connect;

  end;

  ComboHook2 := HookedCombo_Create;
  if assigned(ComboHook2) then
  begin
    ComboHook2.ComboImg := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Combo.png');
    ComboHook2.FrameColor := $FCAC65;
    ComboHook2.FrameHighLite := $FFE9D6;

    ComboHook2.SetComboParentObj(ComboBox2);
    ComboHook2.Connect;
  end;
und an stelle dessen!

Delphi-Quellcode:
ComboHook := HookedCombo_Create;
  if assigned(ComboHook) then
  begin
    ComboHook.ComboImg := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Combo.png');
    ComboHook.FrameColor := $FCAC65;
    ComboHook.FrameHighLite := $FFE9D6;

    ComboHook.SetComboParentObj(self);
    ComboHook.Connect;

  end;

verwenden um alle Comboboxen der Anwendung innerhalb der DLL zu enumerieren/verwalten..

Medium 7. Jul 2011 00:00

AW: TCollection = not TCollection ?
 
Sekunde... Wessen self übergibst du, und warum ist das auf einmal ein Handle? :gruebel: Wenn du nicht gerade eine BPL (statt DLL) hast, und keinen Speicher rummappst, dann hast du in der DLL keinerlei Zugriff auf den Adressraum deiner Anwendung, und folglich auch keinen auf die Dinge, die die VCL so inne hat. Es mag sein, dass VB hier implizit mit COM Interfaces hantiert, so dass das alles rosig ausschaut, aber so ein Kissen hast du in Delphi nicht - zumindest nicht von Hause aus. Du könntest bestenfalls das (tatsächliche) Windows-Handle deines Formulares übergeben, und mittels FindWindowsEx() (also nackter WinAPI) die ChildControls durchgehen und an diesen, wiederum mit nackter WinAPI, Dinge tun. Aber die hübsche VCL Sicht wirst du so ohne Weiteres nicht in deine DLL geschoben bekommen.

Mir fehlt aber generell ein wenig "Vorarbeit" zu dem, was hier so insgesamt überhaupt alles passiert. DLL ist ja auch nicht immer gleich DLL. Hier scheint nen Hook zu sein, derer es auch wieder verschiedene Arten gibt. Was, wie, wer und vor allem gegen wen? :)

EWeiss 7. Jul 2011 06:12

AW: TCollection = not TCollection ?
 
Also wenn ich hier ein Self übergebe

Delphi-Quellcode:
ComboHook.SetComboParentObj(self);

Ist es für mich ersichtlich das es sich nur um die MainForm handeln kann.
Da auf dieser die ganzen Komponenten aufgesetzt sind.

Delphi-Quellcode:
procedure THookedCombo.SetComboParentObj(Ctrl: TWinControl);
begin

  FParentObj := Ctrl;
end;
Das ParentHandle wäre also dann FParentObj.Handle

Mit diesem hole ich mir dann die Handles der auf self(MainForm) befindlichen Comboboxen über FindWindowExW
Aber wie gesagt es kommt nur die Hälfte von Self in der DLL an.
Das will irgendwie keiner so richtig verstehen was ich meine.

Zitat:

Aber die hübsche VCL Sicht wirst du so ohne Weiteres nicht in deine DLL geschoben bekommen.

Will ich auch nicht sondern nur das was in der Liste von Self steht :)
Du siehst aber das es geht ansonsten würdest du die Bitmaps nicht in den Comboboxen sehen können. (Ohne Hook)

gruss

himitsu 7. Jul 2011 08:31

AW: TCollection = not TCollection ?
 
Dann nimm eben keine DLL, sondern eine BPL.
Schon hast du überall die gleiche RTTI, den gleichen Speichermanager und diesbezüglich keinerlei Probleme mehr.

EWeiss 7. Jul 2011 09:07

AW: TCollection = not TCollection ?
 
Zitat:

Zitat von himitsu (Beitrag 1110480)
Dann nimm eben keine DLL, sondern eine BPL.
Schon hast du überall die gleiche RTTI, den gleichen Speichermanager und diesbezüglich keinerlei Probleme mehr.

Die muss man aber Installieren oder?
Und habe auch keinerlei erfahrung damit.

gruss

Medium 7. Jul 2011 17:04

AW: TCollection = not TCollection ?
 
Zitat:

Zitat von EWeiss (Beitrag 1110463)
Also wenn ich hier ein Self übergebe

Delphi-Quellcode:
ComboHook.SetComboParentObj(self);

Ist es für mich ersichtlich das es sich nur um die MainForm handeln kann.
Da auf dieser die ganzen Komponenten aufgesetzt sind.

Für mich nicht, weil aus dieser einen Zeile heraus nicht erkennbar ist, aus welchem Kontext heruas du diesen Aufruf machst, und grad self IST der Kontext ;). Wenn diese Zeile in einer Methode der MainForm steht, dann ja. Aber auch dann ist es eben nur ein Pointer, der im Adressraum der Anwendung Gültigkeit hat, nicht in der DLL. Wenn du zusätzlich noch das (tatsächliche) Handle in die DLL gibst, kannst du darüber natürlich via WinAPI Aufrufen arbeiten, weil DIE sind systemweit gültig.
Self ist kein Handle, sondern Idendisch mit z.B. dem, was ein TMyClass.Create() zurück liefert, und somit einfach eine Adresse auf den Heap, der wiederum im für nur deinen gerade aktiven Prozesses gemappten Speicher liegt, wo von aussen (ohne Tricks) keiner dran kommt. DLLs bekommen ihren eigenen Heap zugewiesen, und kommen an den der benutzenden Applikation nicht dran, ausser man kümmert sich von Hand darum, ooooder nutzt BPLs, wo sich ein von Delphi mit geliefertes "Framework" automatisch darum kümmert.
Ohne dies kennt die DLL die Struktur hinter dem gelieferten Pointer nicht (TForm ist eine Klasse der VCL, und all ihre Felder liegen ebenfalls im Adressraum der Anwendung), und selbst wenn man TForm der DLL bekannt machen würde und darauf casted, ist es noch immer ein ungültiger Pointer auf zufällige Daten im Adressraum der DLL.

Du musst zwischen Pointern und Handles unterschieden, ich glaube daher kommt deine Verwirrung. Das ist bei der VCL auch etwas gemischt, da hier Windows-Controls, die ein Systemhandle haben, mit VCL-eigenen Properties und Methoden gekapselt wird. Man kommt also via VCL Methoden (TForm.XXX()) ran, als auch über WinAPI Funktionen (SetWindowLong(MyForm.Handle, ...)). Erstere Möglichkeit fällt eben weg, wenn du den Adressraum deiner Anwendung verlässt.

EWeiss 7. Jul 2011 17:11

AW: TCollection = not TCollection ?
 
Ich habe das jetzt verworfen und übergebe die Komponenten direkt.

Delphi-Quellcode:
  for IComb := 0 to Form1.ComponentCount - 1 do
  begin
    Ctrl := Form1.Components[IComb];
    sCtrl := Ctrl.ClassName;

    If (sCtrl = 'TComboBox') or
       (sCtrl = 'TFilterComboBox') or
       (sCtrl = 'TDriveComboBox') then
    begin
      ComboHook := HookedCombo_Create;
      if assigned(ComboHook) then
      begin
        ComboHook.SetComboParentObj(TWinControl(Ctrl));
        ComboHook.ComboImg := ScrbMemoHook.CreateImageFromFile(FilePath + 'ScrollBarSkin\Combo.png');
        ComboHook.FrameColor := $FED3AC;
        ComboHook.FrameHighLite := $666666;
        ComboHook.FrameStyle := FrameFlat;
        ComboHook.Connect;
      end;
    end;
  end;
Die Funktion ist dadurch gegeben wenn auch nicht so elegant wie ich es ursprünglich implementieren wollte.

Danke für deine Erklärungen.

PS:
Zitat:

Erstere Möglichkeit fällt eben weg, wenn du den Adressraum deiner Anwendung verlässt.
Muss da nochmal Nachhaken.

Wenn es so ist wie du sagst.
Müßte die Übergabe so wie sie jetzt von statten geht das gleiche sein.
So.. Dann erkläre mir mal warum ich hier die richtigen Handles bekomme ?
Wenn dem nicht so wäre würden sich die Bitmaps ja auf Irreguläre Positionen setzen
und keinerlei Events der Button funktionieren.

Auch hier bin ich außerhalb des Adressraums meiner Anwendung;)

gruss

gruss

himitsu 7. Jul 2011 18:12

AW: TCollection = not TCollection ?
 
Zitat:

Zitat von EWeiss (Beitrag 1110490)
Die muss man aber Installieren oder?
Und habe auch keinerlei erfahrung damit.

Die kann man auch wie eine normale DLL verwenden.

Wenn man sie statisch läd, dann braucht man nichtmal die Prozeduren/Funktionen exprotieren/importieren ... macht alles Delphi für einen.

Man indet nur über Uses die Units ein, welche man möchte und sobald die Anwendung mit Laufzeitpackages kompiliert wird und dieses Package mit angegeben wurde, dann werden die Units nicht mehr in die EXE eingebunden, sondern werden nur automatisch mit der BPL verlinkt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
Seite 3 von 4     123 4      

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