Willkommen im #Neuland
Login wie bei quake.ingame.de zuvor, die Passwörter aus der alten Datenbank wurden aber gelöscht - einmal hier neu anfordern.
Wer seine E-Mail-Adresse nicht mehr hat oder kennt, bitte eine Nachricht mit Infos schicken o. im Discord melden.

PQ Discord Server: #planetquake                                                                                                                                         Spenden? Hier entlang!

Probleme mit Delphi und Zeigern

Forum für alles rund ums Coden und web.design - HTML, XHTML, XML, CSS, PHP, ASP, Zugriffsrechten, Mods uvm.
Antworten
ManDay

Beitrag von ManDay »

Macht mir keine Vorwürfe ich kann kein Delphi und will es auch nicht lernen.

Folgendes Problem - in vereinfachter Syntax (TCanvas ist ein Unterobjekt von TImage, ein Standardelemetn des Forumlars zur implemtierung von Zeichenflächen).

class TTest{ p1: ^TCanvas; TTest( const desktop: TCanvas ); f1( ); }

Der CF geht folgendermaßen (i_main ist eine besagte Zeichenfläche):

var t1: TTest;

[...]

TTest.TTest( const dektop: TCanvas ){ p1 := @desktop }
TTest.f1( ){ p1^.Ellipse( 0,0,10,10 ) }

[...]

t1 := TTest.TTest( i_main.TCanvas );
t1.f1( );

Als Ergebnis stürz das Programm beim Versuch p1^.Ellipse auszuführen ab. ASM:

call dword ptr [edx+$10]

Ich habe einige Vermutungen wobei es aber nichts bringen würde die zu erläutern. Ich habe auch schon versucht die Ellipse-Funktion selbst zu refernzieren, weiss aber nicht wie ein Zeiger auf eine Funktion zu verwirklichen ist.

EDIT:

Es geht wenn ich TImage (Elternobject von TCanvas) referenziere. Warum aber kann ich nicht auf TCanvas direkt zeigen ?

En plus:

Wie kann ich als Funktionsparameter einen Zeiger eigenen Typs übergeben ohne erst eine eigene Zeigerklasse auf den Typ zu adaptieren ?

procedure f2( p1: ^TTest );

geht nicht

EDIT:

Folgendes Problem. In einem Array Typ TSnowflake existieren verschiede Elemente. Ich habe folgende Funktionen für die Matrix gemacht:

function m_pop( );
var tcnt_TSnowflake
begin
tcnt_TSnowflake := matrix[ Length( matrix ) - 1 ];
matrix[ Length( matrix ) - 1 ].Destroy( );
setLength( matrix,Length( matrix ) - 1 );
Result := tcnt_TSnowflake;
end;

Aus einer anderen Funktion herraus gibt m_pop( ) richtige Ergebnisse zurück. Auch der Befehl:

matrix[ 0 ] := TSnowflake.TSnowflake( ) //bzw .Create( )

setzt das erste Elem. des Arrays auf korrekte Werte.

Jedoch resultiert aus

matrix[ 0 ] := matrix[ Length( matrix ) - 1 ];

oder

matrix[ 0 ] := m_pop( );

eine Leerstelle an matrix[ 0 ]. Warum ?
Antworten