AGB  ·  Datenschutz  ·  Impressum  







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

Übersetzung Class MagneticWindow

Ein Thema von EWeiss · begonnen am 9. Okt 2006 · letzter Beitrag vom 18. Dez 2006
Antwort Antwort
Seite 5 von 12   « Erste     345 67     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#41

Re: Übersetzung Class MagneticWindow

  Alt 10. Okt 2006, 22:41
Zitat von Union:
In der Standardkonfiguration heißt es result (extended Syntax). Das hat den Vorteil, dass man die Funktion umbenennen kann, ohne den evtl. verwendeten Namen 20 Mal ebenfalls ändern zu müssen. Und es ermöglicht Rekursion, wenn gewollt.
Danke habs geändert .. kann es aber noch nicht prüfen
da ich noch nicht bis hierher vordringen kann!

Die Klasse ist bis auf ein paar kleinigkeiten übersetzt.
Befinde mich nun in der Form und rufe diese mit diesen parametern auf.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
Var
  m_Magnetic: TMagnetic;
begin
  m_Magnetic := TMagnetic.Create; // Class TMagnetic Initialisieren
  m_Magnetic.AddWindow(Form1.Handle); // Main Handle (Hauptanwendung) addieren

end;

end.
Beim ersten aufruf direkt der erste Fehler!

Delphi-Quellcode:
    // Validate windows
    If (IsWindow(Handle) And (IsWindow(hWndParent) Or (hWndParent = 0))) Then
        begin
        // Increase count
        inc(m_lWndCount);
        // Resize arrays
// ReDim Preserve m_uWndInfo(0 To m_lWndCount);
// ReDim Preserve m_rcWnd(0 To m_lWndCount);

        // Add info
        With m_uWndInfo[m_lWndCount] do
          begin
            hwnd := Handle;
            hWndParent := hWndParent;
          end;
Er springt bis hwnd := Handle; dann gibt es einen AV
m_uWndInfo : array of TWND_INFO;
Delphi-Quellcode:
Type
 PWND_INFO = ^TWND_INFO;
    TWND_INFO = record
    hwnd : Integer;
    hWndParent : Integer;
    Glue : Boolean;
 end;
Das ist die Type welche angesprochen wird.
Dieser wird durch ReDim Preserve m_uWndInfo(0 To m_lWndCount); verursacht
Das Array wurde noch nicht redimensioniert!
Habe noch keine umsetzungs möglichkeit dafür gefunden!


Doch gerade!
Zitat:
REDIM
To allocate dynamic variables, use New or GetMem. For REDIM PRESERVE, allocate memory for the new variable and copy the old values to the new memory, and erase the old variable with Dispose or FreeMem. A ReAllocMem function is also available.
Wie müßte die funktion dann aussehen?
für ReDim Preserve m_uWndInfo(0 To m_lWndCount);


Gruß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#42

Re: Übersetzung Class MagneticWindow

  Alt 10. Okt 2006, 22:45
Zitat von Muetze1:
Du hast 100%ig zIdx nicht nochmal woanders verwendet bzw. deklariert? z.B. als Funktionsname?
Delphi-Quellcode:
function TMagnetic.zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer;
//Get the sc_aSubData() array index of the passed hWnd
//Get the upper bound of sc_aSubData()
//If you get an error here, you're probably Subclass_AddMsg-ing before Subclass_Start

begin
    zIdx := UBound(sc_aSubData);
     While zIdx >= 0 Do //Iterate through the existing sc_aSubData() elements
        With sc_aSubData[zIdx] do
        begin
            If (hwnd = lng_hWnd) Then //If the hWnd of this element is the one we're looking for
            begin
              If (Not bAdd) Then //If we're searching not adding
                Exit; //Found
              If (hwnd = 0) Then //If this an element marked for reuse.
              begin
                If (bAdd) Then //If we're adding
                    Exit;
              end;
            End;
        End;
        dec(zIdx); //Decrement the index

End;
zIdx ist die funktion in der ich mich befinde.
Ansonsten wird sie nur im Header als privat nochmal aufgeführt!
function zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer;

Gruß
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#43

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 00:35
Zu deinem REDIM Problem: SetLength()
  SetLength(Array, NeueLänge); // danach hat das Array von Low(Array) bis High(Array) Einträge - bzw. da es dynamisch ist von 0 bis Length(Array)-1
Zitat von EWeiss:
Zitat von Muetze1:
Du hast 100%ig zIdx nicht nochmal woanders verwendet bzw. deklariert? z.B. als Funktionsname?
zIdx ist die funktion in der ich mich befinde.
Ansonsten wird sie nur im Header als privat nochmal aufgeführt!
function zIdx(lng_hWnd: Integer; bAdd: Boolean = False): Integer;
Dann ist es klar, warum er ein Handle will. Das hatte ich vorhin übersehen. Dadurch wird auch dei Rekursionshinweise der anderen erklärlich. Die Lösung mit der Verwendung von Result hast du ja nun schon.
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#44

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 00:42
Hallo,

hierzu
Delphi-Quellcode:
WMSZ_LEFT, WMSZ_TOPLEFT, WMSZ_BOTTOMLEFT:
  begin
      case Abs(rcTmp.x1 - x1) < SnapWidth of True:
       rcWnd.x1 := x1;
      end;
      case Abs(rcTmp.x1 - x2) < SnapWidth of true:
       rcWnd.x1 := x2;
      End;
   End;
fällt mir noch was ein:
Warum benutzt Du überhaupt bei einer boolschen Abfrage case?
So ist es doch viel logischer und einfacher zu verstehen:
Delphi-Quellcode:
WMSZ_LEFT, WMSZ_TOPLEFT, WMSZ_BOTTOMLEFT:
begin
  if Abs(rcTmp.x1 - x1) < SnapWidth then
    rcWnd.x1 := x1;

  if Abs(rcTmp.x1 - x2) < SnapWidth then
    rcWnd.x1 := x2;
end;
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#45

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 01:24
Warum benutzt Du überhaupt bei einer boolschen Abfrage case?
So ist es doch viel logischer und einfacher zu verstehen:
Delphi-Quellcode:
WMSZ_LEFT, WMSZ_TOPLEFT, WMSZ_BOTTOMLEFT:
begin
  if Abs(rcTmp.x1 - x1) < SnapWidth then
    rcWnd.x1 := x1;

  if Abs(rcTmp.x1 - x2) < SnapWidth then
    rcWnd.x1 := x2;
end;

Werde mir den Vorschlag mal durch den Kopf gehen lassen
Bei Vb ist ein Case Anweisung schneller als eine IF abfrage.

gruß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#46

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 01:43
  SetLength(Array, NeueLänge); // danach hat das Array von Low(Array) bis High(Array) Einträge - bzw. da es dynamisch ist von 0 bis Length(Array)-1 Supi läuft jetzt durch bis zum nächsten Fehler.
Danke

Zitat:
Dann ist es klar, warum er ein Handle will. Das hatte ich vorhin übersehen. Dadurch wird auch dei Rekursionshinweise der anderen erklärlich. Die Lösung mit der Verwendung von Result hast du ja nun schon.
Jo habe das mit dem Result übernommen aber soweit bin ich mit meinen
Durchlauf noch nicht gekommen.

gruß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#47

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 02:15
Delphi-Quellcode:
    // Validate windows
    If (IsWindow(Handle) And IsWindow(hWndParent)) Or (hWndParent = 0) Then
        begin
        // Increase count
        inc(m_lWndCount);
        // Resize arrays
        SetLength(m_uWndInfo, m_lWndCount);
// ReDim Preserve m_uWndInfo(0 To m_lWndCount);
        SetLength(m_rcWnd, m_lWndCount);
// ReDim Preserve m_rcWnd(0 To m_lWndCount);

        // Add info
        With m_uWndInfo[m_lWndCount -1] do
          begin
            hwnd := Handle;
            hWndParent := hWndParent;
          end;
Läuft jetzt durch bis an dieser stelle!
Bei ReDim Preserve funktioniert diese anweisung With m_uWndInfo[m_lWndCount] do Bei SetLength(m_rcWnd, m_lWndCount); muss ich den counter wieder um eins herabsetzen With m_uWndInfo[m_lWndCount -1] do ansonsten werden mir keine Daten übergeben.

Ich denke mal wenn Length(Array)-1 wird das so in Ordnung sein.

gruß
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#48

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 08:56
Das liegt daran, dass in Delphi dynamische Arrays immer mit Index 0 beginnen. Bei SetLength(Array, 10) geht dann z.b. der Index von 0..9
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#49

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 09:50
Hallo,

Du hast hier
Delphi-Quellcode:
        // Add info
        With m_uWndInfo[m_lWndCount -1] do
          begin
            hwnd := Handle;
            hWndParent := hWndParent; <---------
          end;
ein Problem. Deine Variable im Record heißt genauso wie die Variable, die Du zuweisen willst. Delphi benutzt dann zwei mal den Record-Member (geringste Sichtbarkeit).
Meist ist es sowieso besser, with zu vermeiden, dann spart man sich viel Ärger beim Debuggen (der Debugger kann innerhalb eines solchen Blocks Variableninhalte nicht anzeigen ).
Also so:
Delphi-Quellcode:
// Add info
m_uWndInfo[m_lWndCount -1].hwnd := Handle;
m_uWndInfo[m_lWndCount -1].hWndParent := hWndParent;
Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#50

Re: Übersetzung Class MagneticWindow

  Alt 11. Okt 2006, 10:05
Zitat von EWeiss:
Ich denke mal wenn Length(Array)-1 wird das so in Ordnung sein.
Darauf habe ich dich extra hingewiesen mit meinem Kommentar hinter dem SetLength()! Ansonsten nutze die Funktion High()
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 5 von 12   « Erste     345 67     Letzte »    


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 02:03 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