Hé Cheater, nog steeds bezig met het ophalen van gegevens van die game servers?
Delphi werkt sinds versie 2 met strings die maximaal 4 gigabytes lang kunnen zijn (eerst even wat RAM erbij prikken op je moederbord

). Dit is het type
string. Good old Delphi 1 uit de 16-bits Windows-tijd werkte met strings die maximaal 255 karakters lang konden zijn - dit type heet sinds Delphi 2
ShortString. De n-de letter van een string of ShortString kun je ophalen met
MijnStringVariabele[n]. Daarbij begin je bij 1 te tellen, de eerste letter staat dus in
MijnStringVariabele[1].
De lengte van een string of ShortString kun je uitvinden met
Length(MijnStringVariabele). ALLEEN bij een ShortString staat in
MijnStringVariabele[0] de lengte van die string.
Er is nog een derde variant: een ShortString waarvan je de lengte al bij het compileren vastlegt. Dat doe je als volgt:
MijnStringVariabele: string[17] is een string met een vaste lengte van 17 karakters.
Samenvattend:
code:
1
2
3
4
5
6
7
| var
S1: string; { Een string van willekeurige lengte. }
S2: ShortString; { Een 'ouderwetse' string van maximaal 255
karakters. Dit type zul je zelden of nooit
gebruiken. }
S3: string[69]; { Een 'ouderwetse' string met een vaste lengte
van precies 69 karakters. } |
Waarom gebruik ik in de volgende record nou zowel gewone strings als ShortStrings?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| type
TDetails = record
...
NetAddress: string;
HostName: string;
MapName: string;
...
case ModRunning: Boolean of
False: ();
True: (
InfoURL: ShortString;
FTPURL: ShortString;
...
);
end; |
Ik gebruik natuurlijk zoveel mogelijk het type
string, want dat werkt het eenvoudigst. Maar het variabele deel van een record (het gedeelte in de
case-structuur) MOET van de compiler in zijn geheel een vaste lengte hebben. Dat kan met ShortStrings, want de compiler ziet dat gewoon als
string[255] en reserveert voor zowel InfoURL als FTPURL in de recordstructuur 255 bytes.
Stel dat ik zou weten dat NetAddress maximaal 40 karakters lang zou zijn, MapName enorm lang, InfoURL maximaal 50 karakters en FTPURL maximaal 255 karakters. Dan zou ik mijn recordstructuur kunnnen ombouwen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| type
TDetails = record
...
NetAddress: string;
HostName: string; // lengte wordt automatisch aangepast
MapName: string;
...
case ModRunning: Boolean of
False: ();
True: (
InfoURL: string[50];
FTPURL: ShortString; // of FTPURL: string[255];
...
);
end; |
Ondanks dat ik weet dat HostName maximaal 40 karakters lang is, maak ik er geen string[40] van. Reden 1: een string[40] gebruikt ALTIJD 40 bytes geheugen ongeacht de werkelijke lengte van de string.
string gebruikt altijd het werkelijk benodigde geheugen, afhankelijk van de werkelijke lengte van de string - in dit geval 40 bytes of minder. Reden 2:
string is het standaardtype in Delphi voor strings, je werkt er gemakkelijker mee dan met alle andere typen strings en je code is het makkelijkst leesbaar

.
Een goede grap mag vrienden kosten.