
Nastavení indexů(velikostí) typů v jazyce Delphi7
Dobrý den, mám tento kod
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
edt1: TEdit;
edt2: TEdit;
btn3: TButton;
btn4: TButton;
procedure btn1Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type //těchto typů je více, uvádím jen jeden za všechny
PL_TK = record
left: Integer;
top: Integer;
width: Integer;
height: Integer;
image: string;
hint:string;
caption: string;
status: string;
volnost :Boolean;
tag1:string;
tag2:string;
tag3:string;
tag4:string;
end;
type
prvek = record
L_TK:array of PL_TK ;
end;
var
Form1: TForm1;
panelinfo : array of prvek;
indexdopravny: integer;
indexprvku:integer;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
begin
panelinfo[indexpanelu].L_TK[indexprvku].left:=0; //0 je pouze ilustrační, jinak se uloží skutečný left
panelinfo[indexpanelu].L_TK[indexprvku].top:=0; //0 je pouze ilustrační, jinak se uloží skutečný top
//dále by pokračovalo nastavení všech vlastností daného typu (top, width, height ..... atd)
end;
Problém mi dělá nastavení indexů.
Celý program je server a ten čeká na připojení klienta, klient = vlaková stanice a ten zašle udaje serveru o počtu návěstidel v této stanici. Tím tak mám na serveru obraz stanic, což je vlastně dispečer sledující provoz v podřízených stanicích. Dispečer chci ale doplnit možností ovládat podřízené stanice. Ne každý klient při hře muže být trvale u PC (toaleta, večeře, manželka atd.) proto když musí klient odejít, má možnost předat řízení dispečerovi(serveru).
Přestože se vytvoří obraz stanic na serveru a mužu použít vlastnosti jednotlivých Image, je to málo. Proto jsem se rozhodl vytvořit typy které přebírají vlastnosti Image a přidávají vlastnosti nové, které budou využity následně při hře. Jsou to status ten udává zda je řízení na místní obsluhu (klient sám na PC si volí cesty), nebo na dálkovou obsluhu (dispečer řídí klientské PC a to podle toho volí cesty). Volbou cesty se v tomto případě rozumí kolej ve stanici po které pojede vlak. Volnost udává zda příslušná kolej je volná, nebo obsazená a tag1-4 je připraveno pro další využití. Tyto vlastnosti Image chybí, proto jsem si je takto vytvořil.
Problém nastává v tom že při spuštění nejsou typy Panelinfo nadeklarovány, to jsem zkoušel příkazem Setlenght(Panelinfo, lenght(panelinfo) + 1); což mi překladač vzal bez problémů. Tím tak došlo k vytvoření jak panelu, tak i udajů o tomto panelu. Jenže když vytvořím Panel a typ Panelinfo, nevím ještě v té chvíli kolik bude návěstidel (L_TK //levé zhlaví, tratová kolej). A proto se mi nedaří nastavit tu vlastnost tak jak je popsána v procedure TForm1.btn1Click(Sender: TObject);
Abych to tedy shrnul, potřebuji zapsat vlastnoti takto:
panelinfo[indexpanelu].L_TK[indexprvku].left:=0;
přičemž indexpanelu je integer, udávající počet připojených klientů a indexprvku je index toho daného návěstidla, vytvořeného na panelu. Jejich počet vím, protože je klient po připojení zasílá serveru a server si je vyparsuje ze zprávy a vytvoří.
Ale nevím jak postupovat na příkaz Setlenght, či použít jiný příkaz.
Příklad (3 klienti(stanice připojeny))
1 klient - 4 návěstidla
2 klient - 5 návěstidel
3 klient - 6 návěstidel
chci si změnit u 2.klienta 1.návěstidlo:
panelinfo[2].L_TK[1].left:=0;
chci si změnit u 3.klienta 5.návěstidlo:
panelinfo[3].L_TK[5].left:=0;
atd.
Předem děkuji za vaše rady.
Existuje nejaky maximalni pocet navestidel dany hrou? Pokud ano, drz si u klienta jeho pocet a alokuj primo maximalni pocet dany hrou.
Pocet klientu bych nepridaval po jednom, ale nejak dynamicky, pokud by alokovane misto v poli dochazelo + bych si udrzoval pocet.
Takze napr. na zacatku nastavit 20 klientu a pak pridavat po 10 (pocty si uprav dle skutecnosti). Ale to uz je jen detail, na funkci nema vliv.
Pak jsou dalsi moznosti - pouzit na strane serveru nejakou jednoduchou databazi. Vyhovou by bylo to, ze stav je ulozeny trvale, ne jen v pameti. Znamenao by to ale zmenu - klient by pri registraci do hry ziskal nejake jednoznacne ID, kterym by se ve hre vzdy identifikoval a pod nim by mel ulozeny vsechny informace.
Drobna poznamka - Pascal indexuje od nuly, ale to nevadi, ty index nulu jen nevyuzivas
Pro dynamicka pole pouzivej funkce High(), Low()