Jednodušší přístup k polím ve vlastní struktuře? – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Jednodušší přístup k polím ve vlastní struktuře? – Delphi – Fórum – Programujte.comJednodušší přístup k polím ve vlastní struktuře? – Delphi – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Navara
~ Anonymní uživatel
51 příspěvků
10. 11. 2014   #1
-
0
-

Zdravím, mám následující problém:
tvořím aplikaci pro zápis událostí při jízdě vozidla a používám k tomu struktury, které obsahují mimojiné pole stringů. Aplikace průběžně zapisuje do polí ve struktuře nové a nové položky. Tady jsou potřebné části zdroje:

unit U_EditorBS100;

type
TZastavka = record
Nazev: String;
Index: Integer;
UdalostiPriPrijezdu: Array of String;
UdalostiPredPrijezdem: Array of String;
UdalostiPriOdjezdu: Array of String;
UdalostiMezizastUsek: Array of String;
//A dalších několik polí UdalostXXXXX vždy Array of String
end;

TEditorBS100 = class
procedure ZapisUdalostJizdy(IntUdalost: Integer; TxtUdalost: String);
procedure ZapisUdalostiPrijezd;

...

var
ArrZastavky: Array of TZastavka;


procedure TEditorBS100.ZapisUdalostJizdy(IntUdalost: Integer; TxtUdalost: String);
var
PosledniZastavka: Integer;
begin
PosledniZastavka := High(ArrZastavky);

if IntUdalost = 1 then //1 = příjezd
begin
SetLength(ArrZastavky[PosledniZastavka].UdalostPriPrijezdu,
Length(ArrZastavky[PosledniZastavka].UdalostPriPrijezdu)+1);

ArrZastavky[PosledniZastavka].UdalostPriPrijezdu
[High(ArrZastavky[PosledniZastavka].UdalostPriPrijezdu)]
:= TxtUdalost;
end;

if IntUdalost = 2 then //2 = před příjezdem
begin
SetLength(ArrZastavky[PosledniZastavka].UdalostPredPrijezdem,
Length(ArrZastavky[PosledniZastavka].UdalostPredPrijezdem)+1);

ArrZastavky[PosledniZastavka].UdalostPredPrijezdem
[High(ArrZastavky[PosledniZastavka].UdalostPredPrijezdem)]
:= TxtUdalost;
end;

//stejně dak pro dalších X možných událostí, vždy zápis do některého z polí
end;

//příklad volání zápisu do některého z polí
procedure TEditorBS100.ZapisUdalostiPrijezd;
begin
ZapisUdalostJizdy(1, 'Čas: ' + FormatDateTime('HH:NN:SS', Now));
end;

Jde mi o to, že událostí muže být až 10 různých druhů, což znamená deset různých Array of String, a do funkce zápisu položky psát příkazy zvětšení pole a zápis do poslední položky pro každé pole zvlášt je tímto způsobem zralé akorát na lehce přehlédnutelné chyby. Mám takovou představu že by šlo nejprve přiřadit nějaké proměnné informaci o to, do kterého pole se bude zapisovat, a pak s tou proměnnou pracovat jako s tím vlastním polem. Způsob by měl fungovat asi takhle:

procedure TEditorBS100.ZapisUdalostJizdy(IntUdalost: Integer; TxtUdalost: String);
var
PosledniZastavka: Integer;
PoleProZapis: Array of String;
begin
PosledniZastavka := High(ArrZastavky);

if IntUdalost = 1 then PoleProZapis := ArrZastavky[PosledniZastavka].UdalostPriPrijezdu;
if IntUdalost = 2 then PoleProZapis := ArrZastavky[PosledniZastavka].UdalostPredPrijezdem;
//a další pole...

SetLength(PoleProZapis, Length(PoleProZapis)+1);
PoleProZapis[High(PoleProZapis)]:= TxtUdalost;
end;

Tento způsob však nefunguje, řádek "if IntUdalost = 2 then PoleProZapis := ArrZastavky[PosledniZastavka].UdalostPredPrijezdem;" ukazuje chybu Incompatible types. Lze tedy najít nějaký způsob, jak takhle jednodušeji zvolit pole pro zápis a pak s ním takhle podobně pracovat? Našel jsem něco o ukazatelích, jen nevím jak přeně s tím pracovat.

Děkuji.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 46.135.52.–
Reklama
Reklama
JoDiK
~ Anonymní uživatel
981 příspěvků
10. 11. 2014   #2
-
0
-

Zaveď si vlastni typ pole, pak to přiřazení bude fungovat.

type

Tpole = array of string;

TZastavka = record
Nazev: String;
Index: Integer;
UdalostiPriPrijezdu: Tpole;
UdalostiPredPrijezdem: Tpole;
UdalostiPriOdjezdu: Tpole;
UdalostiMezizastUsek: Tpole;
//A dalších několik polí UdalostXXXXX vždy Tpole
end;

...

procedure TEditorBS100.ZapisUdalostJizdy(IntUdalost: Integer; TxtUdalost: String);
var
PosledniZastavka: Integer;
PoleProZapis: Tpole;
begin
PosledniZastavka := High(ArrZastavky);

if IntUdalost = 1 then PoleProZapis := ArrZastavky[PosledniZastavka].UdalostPriPrijezdu;

PS: existuje možnost jak to všechno udělat jednodušeji, ale podle tvého stylu programování tam teprve musíš dospět... ta možnost se jmenuje OOP.

Nahlásit jako SPAM
IP: 88.103.228.–
Navara
~ Anonymní uživatel
51 příspěvků
11. 11. 2014   #3
-
0
-

Odpověď pomohla, děkuji.
Ohledně OOP - i za tuhle radu děkuji, rozhodně nechci u programování skončit na své aktuální úrovni.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 46.135.72.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 10 hostů

Podobná vlákna

Soubor ve struktuře — založil Jan

Retazec v strukture — založil michal

Ukazatel ve strukture — založil Hlavinka

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý