Toon posts:

[Delphi] Een instance van een record maken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het idee is om de Data property van een TTreeNode naar een record te laten wijzen. Ik wil hiervoor gewoon een nieuw record maken, en dat toewijzen aan de Data pointer, zodat ik er geen omkijken meer naar heb.
Het is natuurlijk mogelijk om dit met een array te doen, maar ik ben er van overtuigd dat er andere manieren zijn dan een array of een gewone declaratie...

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06:09

Tomatoman

Fulltime prutser

1. Geheugen alloceren voor je records.
2. Per record een pointer opslaan in je TreeNode.
3. Een beetje met je records spelen. Je kunt ze benaderen via de pointers.
4. Geheugen opruimen.

Een goede grap mag vrienden kosten.


Verwijderd

Topicstarter
Dat lijkt me de beste oplossing ja.. helaas moet ik me nog steeds bezighouden met het opruimen en creeëren van de Objects, maar daar is niets aan te doen.

Maar hoe reserveer ik nu geheugen voor zo'n record?
Ik kan namelijk niet een nieuwe instance ervan maken door TRecordName.Create aan te roepen.
Moet ik dan AllocMem(sizeof(TRecordName)) gebruiken?

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 06:09

Tomatoman

Fulltime prutser

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TMyRec = record
    Str18 = string[18];
    Almost1000 = Integer;
  end;
var
  P: ^TMyRec;
begin
  New(P);
  P^.Str18 := 'Now you see it...';
  P^.Almost1000 := 999;
  Dispose(P);   { Now you don't... }
end;

Een goede grap mag vrienden kosten.


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Op vrijdag 19 april 2002 00:03 schreef tomatoman het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TMyRec = record
    Str18 = string[18];
    Almost1000 = Integer;
  end;
var
  P: ^TMyRec;
begin
  New(P);
  P^.Str18 := 'Now you see it...';
  P^.Almost1000 := 999;
  Dispose(P);   { Now you don't... }
end;
Eeehh... ja, maar bij de declaratie van Str18 en Almost1000 bedoel je natuurlijk een : ipv een =

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Nog iets, om nog ff verder te gaan met die pointers:

Stel ik heb dit:
code:
1
2
3
4
5
6
var
   Plaatje: TBitmap;

...
procedure Blur (var InputPicture: TBitmap);
...

Als ik de functie aanroep en Plaatje meegeef, geeft hij toch gewoon een pointer naar de bitmap mee? Het volgende werkt immers ook:
code:
1
2
3
4
5
6
7
8
9
type
   PBitmap = ^TBitmap;

var
   Plaatje: PBitmap;

...
procedure Blur (var InputPicture: PBitmap);
...

Als ik dan Plaatje meegeef als parameter kan ik ook rustig tekenen in het plaatje. Maar geef ik in het tweede voorbeeld dan eigenlijk een pointer naar een pointer mee?

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Kom op jongens, ik heb ondertussen al geslapen! We zijn al 12 uur verder! Als dit een toets was, waren jullie gezakt :P

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Op vrijdag 19 april 2002 00:56 schreef GerbenW het volgende:
Nog iets, om nog ff verder te gaan met die pointers:
...
Inderdaad, het eerste geval is gewoon een pointer. Dit omdat Delphi 'stiekem' pointers maakt van TObjects.

Het tweede geval is (dus) een pointer naar een pointer.

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
Op vrijdag 19 april 2002 00:03 schreef tomatoman het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
type
  TMyRec = record
    Str18 = string[18];
    Almost1000 = Integer;
  end;
var
  P: ^TMyRec;
begin
  New(P);
  P^.Str18 := 'Now you see it...';
  P^.Almost1000 := 999;
  Dispose(P);   { Now you don't... }
end;
Maar hoe combineer ik dit nu met de .Data property?
code:
1
2
3
4
info : ^TNodeInfo;
....
New(info);
created.Data := info;

Geeft geen errors, maar zodra ik dan de record wil inzien, krijg ik een error.
code:
1
ShowMessage(Created.Data^.Filename);

geeft [Error]: Record, object, or class type required.

Verwijderd

Op vrijdag 19 april 2002 12:23 schreef Varienaja het volgende:

Inderdaad, het eerste geval is gewoon een pointer. Dit omdat Delphi 'stiekem' pointers maakt van TObjects.
Is algemeen bekend. Zou ook niet best zijn als het niet zo was.

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Op vrijdag 19 april 2002 18:11 schreef dR_n00b het volgende:
code:
1
ShowMessage(Created.Data^.Filename);

geeft [Error]: Record, object, or class type required.
Doe eens:
code:
1
ShowMessage((Created.Data as TDingdatjegemaakthebt).Filename);

of
code:
1
ShowMessage(TDingdatjegemaakthebt(Created.Data).Filename);

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
Op vrijdag 19 april 2002 18:58 schreef Varienaja het volgende:

[..]

Doe eens:
code:
1
ShowMessage((Created.Data as TDingdatjegemaakthebt).Filename);

of
code:
1
ShowMessage(TDingdatjegemaakthebt(Created.Data).Filename);
Dit moet dan
code:
1
ShowMessage(TDingdatjegemaakthebt(Created.Data^).Filename);

zijn lijkt me

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:25

Creepy

Tactical Espionage Splatterer

Op zaterdag 20 april 2002 20:57 schreef dR_n00b het volgende:

[..]

Dit moet dan
code:
1
ShowMessage(TDingdatjegemaakthebt(Created.Data^).Filename);

zijn lijkt me
Hmm.. TDingetje is meestal het type, en PDingetje is meestal een pointer naar dat type (Naming conventions).

Dan dus of TDingetje(blaat.data).Filename of PDingetje(blaat.data)^

TDingetje(Created.data) lukt trouwens alleen als TDingetje een TObject, of een afgeleide daarvan is. Als TDingetje een record is zul je toch PDingetje(Created.data)^ moeten doen (*dus met een pointer)

^ pas NA de haakjes. (Eerst .data casten naar het pointer type, en dan pas dereferencen)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Op zondag 21 april 2002 11:44 schreef Creepy het volgende:

[..]

Hmm.. TDingetje is meestal het type, en PDingetje is meestal een pointer naar dat type (Naming conventions).

Dan dus of TDingetje(blaat.data).Filename of PDingetje(blaat.data)^

TDingetje(Created.data) lukt trouwens alleen als TDingetje een TObject, of een afgeleide daarvan is. Als TDingetje een record is zul je toch PDingetje(Created.data)^ moeten doen (*dus met een pointer)

^ pas NA de haakjes. (Eerst .data casten naar het pointer type, en dan pas dereferencen)
1: Ik snap PDingetje niet, of word die cast automatisch aangemaakt?
2: Het werkt niet,
code:
1
ShowMessage(TDingdatjegemaakthebt(Created.Data^).Filename);

werkt daarentegen wel, dus wie wat hier fout doet, ik weet het zo langzamerhand niet meer :P

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:25

Creepy

Tactical Espionage Splatterer

TDIngetje en PDingetje moet je allebei zelf aanmaken.
Maar als TDingetje een object is hoef je geen Pdingetje te maken omdat je je object zo aan die data kan hangen en kan benaderen met TDingetje(node.data).whatever.

Als TDingetje een record is (TDingetje = record begin ... end) dan moet je ook een PDingetje aanmaken (PDingetje = ^Tdingetje) en moet je het benaderen met een pointer ( PDIngetje(node.data)^.whatever)

Hmm.. TDingetje(node.data^).whatever zou ook moeten werken ja (alhoewel dat niet mijn voorkeur heeft.. maar ja.. wie ben ik :) ). Dan heb je inderdaad je pointer niet nodig, maar nogmaals, als TDingetje een (afgeleide van) TOBject is kan je heel dat pointer verhaal en daarmee ook de ^ wel vergeten.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1