AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TCollection = not TCollection ?

Ein Thema von EWeiss · begonnen am 6. Jul 2011 · letzter Beitrag vom 7. Jul 2011
Antwort Antwort
Seite 3 von 4     123 4      
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#21

AW: TCollection = not TCollection ?

  Alt 6. Jul 2011, 22:08
"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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#22

AW: TCollection = not TCollection ?

  Alt 6. Jul 2011, 22:21
"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

Geändert von EWeiss ( 6. Jul 2011 um 22:38 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#23

AW: TCollection = not TCollection ?

  Alt 6. Jul 2011, 22:44
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..

Geändert von EWeiss ( 7. Jul 2011 um 18:18 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#24

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 01:00
Sekunde... Wessen self übergibst du, und warum ist das auf einmal ein Handle? 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?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 7. Jul 2011 um 01:03 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#25

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 07:12
Also wenn ich hier ein Self übergebe

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

Geändert von EWeiss ( 7. Jul 2011 um 07:17 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#26

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 09:31
Dann nimm eben keine DLL, sondern eine BPL.
Schon hast du überall die gleiche RTTI, den gleichen Speichermanager und diesbezüglich keinerlei Probleme mehr.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#27

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 10:07
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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#28

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 18:04
Also wenn ich hier ein Self übergebe

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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 7. Jul 2011 um 18:08 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#29

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 18:11
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

Geändert von EWeiss ( 7. Jul 2011 um 18:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#30

AW: TCollection = not TCollection ?

  Alt 7. Jul 2011, 19:12
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:36 Uhr.
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