Problem med klasser og pointere

Tags:    delphi

<< < 12 > >>

Hej,

Jeg sider og leger med et konsol system, og jeg har en kommando type som hedder CTYPE_FUNCTION. Når en kommando er at denne type, kalder jeg en pointer som referere til funktionen. Funktionen er altid:
Fold kodeboks ind/udKode 


Dette ligger i en type:
Fold kodeboks ind/udKode 


Når jeg så kalder jeg pointerens adresse sådan her:
Fold kodeboks ind/udKode 


fCommands[I].P indeholder pointeren og ToPass indeholder argumenterne.

Hvis vi antager at fCommands[I].P referere til flg. funktion:
Fold kodeboks ind/udKode 


Så virker det fint. Hvis jeg istedet bruger
Fold kodeboks ind/udKode 


Så fejler den ! Noget siger mig, at det er fordi jeg kalder fra en anden klasse(TGLConsole, som nedarver fra TConsole, som nedarver TObject), og at Exit så tror at den er en del af denne klasse, og kan derfor ikke finde viewer, medmindre den for at vide at den skal kigge i en anden klasse(TEngineModule). Nogen der kan bekræfte dette. Eller bare hjælpe mig med at få det til at virke ?

MH.

The-Freak

Livet er for kort til at kede sig.



13 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Ok jeg har lige kiget lidt nærmere på det hele og lurede:

procedure TConsole.RegisterCommand(Name, Help: String;
T: TConCommandType; P: Pointer);
begin
if FindCommand(Name) = -1 then
begin
SetLength(fCommands, High(fCommands)+2);
fCommands[High(fCommands)].Name := Lowercase(Name);
fCommands[High(fCommands)].Help := Help;
fCommands[High(fCommands)].T := T;
fCommands[High(fCommands)].P := P;
end;
end;

Hvor P er en ukendt pointer (hvilket teoretisk set er OK - men ikke særligt hensigts mæssigt)... men se nu her:

Console.RegisterCommand('togglecon', 'Toggles console visibility',
CTYPE_FUNCTION, @TEngineModule.ToggleVisible);

Her tilskriver du en member (funktion) af en klasse til en pointer, der forventes at pege på en simpel funktion (Og IKKE en member funktion!) ULOGISK FEJL!!!!

For at løse det skal du lave:

TConFunction = procedure(Params: String);

om til...

TConFunction = procedure(Params: String) of object;

og rette resten af klassen til, hvor end der må opstå konflikter!

For at undgå en lign. situation i fremtiden ville jeg bruge TConFunction i stedet for en ukendt pointer!

Altså din TConCommand record's P variabel...

TConCommand = record
Name: String;
Help: String;
T: TConCommandType;

P: Pointer; // <------ Orginal
end;

skal laves om til:

TConCommand = record
Name: String;
Help: String;
T: TConCommandType;

P: TConFunction; // <------ Ændring
end;

og yderligere skal...

procedure TConsole.RegisterCommand(Name, Help: String;
T: TConCommandType; P: Pointer);

laves om til:

procedure TConsole.RegisterCommand(Name, Help: String;
T: TConCommandType; P: TConFunction);

...og alle de andre tilsvarende steder i dine klasser og objekter hvor ukendte pointers kan afløses af kendte pointers! I det hele taget undgå at brug ukendte pointers med mindre du er 110% sikker på dit kode!

------------------------------------------------
ALTERNATIV KODE KOMMENTAR
------------------------------------------------

Hvis jeg må indskyde en kommentar til resten af klassen, så er der mange steder, hvor det ser lidt mærkligt ud eks:

Byte(fCommands[I].P^) := StrToInt(Arguments[1]);

For mig ser det ud som om at du konventere en tekst streng om til en integer, der bliver assignet som en Byte der skal fungere som en pointer (addresse i hukommelsen) for en funktion! Det kan da vist kun gå galt!!!! :D

------------------------------------------------

Held og Lykke

[Redigeret d. 22/03-05 03:29:04 af Søren Klit Lambæk]



For at lave en pointer til en simpel funktion kan du gøre således:

Fold kodeboks ind/udKode 


Prøv det og se om det virker!



For at lave en pointer til en simpel funktion kan du gøre således:

Fold kodeboks ind/udKode 


Prøv det og se om det virker!


Ikke helt med ?? :S... Selvfølgelig virker det! Du kalder jo test Direkte :P...

MH.

The-Freak

Livet er for kort til at kede sig.



Ahh nu tror jeg at jeg kan gennemskue hvad du vil (Ret mig hvis jeg tager fejl)...

Du vil lave en pointer til en member-function og ikke til en simpel funktion?



Prøv med:

Fold kodeboks ind/udKode 


i stedet!



Prøv med:

Fold kodeboks ind/udKode 


i stedet!


Hmmm :\\... Nu giver:
Fold kodeboks ind/udKode 


Invalid typecast :S

MH.

The-Freak

Livet er for kort til at kede sig.




Tror måske du stadig har misforstået mig :P... Jeg vil lave en pointer til en member af en klasse.

MH.

The-Freak

Livet er for kort til at kede sig.



Hmmm... det ville måske være bedst hvis du viste hele koden i sammenhæng, da jeg har lidt svært ved at overskue dit kode! :D



Hmmm... det ville måske være bedst hvis du viste hele koden i sammenhæng, da jeg har lidt svært ved at overskue dit kode! :D


Tja, ok... Men det er 500 linjer eller noget i den stil :P... Here goes:
Fold kodeboks ind/udKode 


Det er konsol uniten. Og her er uniten der bliver kaldt i:

Fold kodeboks ind/udKode 


PS. Til alle der ville vide det, Koden ER copyright by The BNW project!

MH.

The-Freak

Livet er for kort til at kede sig.




Hmmm... Nu kan jeg ikke se hvordan jeg kan referere til en byte, short, word, integer, int64, float, boolean eller string, hvis P er en TConFunction ?? :S

Btw. jeg ved godt der er et par fejl.. Dem fixer jeg senere ;)

MH.

The-Freak

Livet er for kort til at kede sig.



<< < 12 > >>
t