Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В качестве индексов - стринги. [D6, Win2k]


Linder ©   (2002-11-18 11:49:00) 

Привет, Уважаемые Мастера!

Такой вопрос:
Необходимо что-бы в массиве в качестве индексов выступали стринги.

На-пример:

mas: array["вася","петя","коля"] of byte;

mas["вася"]:=3;
mas["петя"]:=7;

и так далее.

Как это сделать,
потому что такое обьявление переменной masкак я привел - не проходит. :((


Pricol   (2002-11-18 15:46:00) [1]

>PVOzerski © (18.11.02 13:40)

Ты бы еще описание проекта вывалил.
Лаконичный ты мой. :)


KoluChi   (2002-11-18 14:43:00) [2]

>Axis_of_Evil © (18.11.02 14:35)
TTerrainType - перечисление, а не массив строк - большая разница.


Axis_of_Evil   (2002-11-18 14:35:00) [3]

2 KoluChi:
Ладно, может облом, но у меня чего-то похожее работало.

Items[Ord(Terrain[x, y])+9].Draw...
где
Terrain: array[0..Map_Size, 0..Map_Size] of TTerrainType;
где
TTerrainType = (DeepWater, Water, Swamp, Dirt1, Dirt2, Dirt3, Dirt4, Hills, Mountain1, Mountain2);


KoluChi   (2002-11-18 14:25:00) [4]

>Axis_of_Evil © (18.11.02 13:55)
function Ord(X): Longint;
Description
X is an ordinal-type or character-type expression.


Axis_of_Evil   (2002-11-18 13:55:00) [5]

mas[ Ord ("вася")] := 3; ?


PVOzerski   (2002-11-18 13:40:00) [6]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
type
tA=class
private
Vasya,Petya:string;
procedure SetValue(idx:string;const value:string);
function GetValue(idx:string):string;
public
property Value[idx:string]:string read GetValue write SetValue;
end;
implementation

procedure tA.SetValue(idx:string;const value:string);
begin
if idx="ВАСЯ" then
Vasya:=value
else if idx="ПЕТЯ" then
Petya:=value;
end;

function tA.GetValue(idx:string):string;
begin
if idx="ВАСЯ" then
Result:=Vasya
else if idx="ПЕТЯ" then
Result:=Petya;
end;
{$R *.DFM}
var
a:tA;
initialization
a:=tA.Create;
a.Value["ВАСЯ"]:="!!!!";
ShowMessage(a.Value["ВАСЯ"]);
end.


Linder   (2002-11-18 12:49:00) [7]

Похоже пока придется остановиться на варианте
(KoluChi © (18.11.02 12:03))

А потом усовершенствую, если будет время.


Skier   (2002-11-18 12:49:00) [8]

>Linder
Тогда сделай что-то похожее на вариант
KoluChi © (18.11.02 12:03)...


Linder   (2002-11-18 12:46:00) [9]

>Skier

Перечисляемый тип нельзя, потому что я открываю текстовый файл, который содержит скрипт.
Анализирую это скрипт, выделяю переменную и формулу.
В формуле я выделяю функцию ("PAS","ACT","REX","FEX")
И теперь должен обработать аргумент функции в зависимлсти от того, что это за функция!

Тоисть, я разгребая скрипт (Linder (18.11.02 12:20)) нашел :
перемення - А1;
функция - "PAS".

Эти две вещи записаны у меня в переменные типа String
Var
P : string; //переменная
F : string; //функция

P:="A1";
F:="PAS";

А теперь имея F:="PAS" (стринговая переменная) мне необходимо вызвать процедуру обработчик для функции "PAS".


Skier   (2002-11-18 12:28:00) [10]

>Linder
А нельзя ли это сделать с помощью перечислимого типа ?

type
TSCRIPT_TYPE = (ST_PAS, ST_ACT, ST_REX, ST_FEX);
//...........
masF : array[TSCRIPT_TYPE] of procedure;
//.............
masF[ST_PAS]:=ProcessPas;
masF[ST_ACT]:=ProcessAct;
masF[ST_REX]:=ProcessRex;
masF[ST_FEX]:=ProcessFex;


Linder   (2002-11-18 12:20:00) [11]

Я анализирую некий скрипт.

А1=PAS("некое выражение");
А2=ACT("некое выражение");
А3=REX("некое выражение");
А4=FEX("некое выражение");


где А1..А4 - переменные,
PAS,ACT,REX,FEX - функции, которые что-то делают с неким выражением

я хочу описать процедурный тип:
masF : array["PAS","ACT","REX","FEX"] of procedure;

в разделе INITIALIZATION поприсваивать различные процедуры для обработки различних функции ("PAS","ACT","REX","FEX")

masF["PAS"]:=ProcessPas;
masF["ACT"]:=ProcessAct;
masF["REX"]:=ProcessRex;
masF["FEX"]:=ProcessFex;

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

И теперь, во время обработки скрипта, я буду просто находить функцию ("PAS","ACT","REX","FEX") и просто вызывать её обработку : masF["PAS"] или masF["ACT"] и так далее.


KoluChi   (2002-11-18 12:03:00) [12]

var
mas_str: array [0..X] of String = ("вася","петя","коля"); //лучше все таки TSrings
mas: array [0..X] of byte;
begin
mas[indexOf(""петя"")] := 1; //indexof - поиск в mas_str
end;


Skier   (2002-11-18 12:01:00) [13]

>Linder
А почему нужна именно такая конструкция ?
Какая цель ? Что хочешь сделать ?


Linder   (2002-11-18 11:53:00) [14]

>Слесарь Матерящийся

Такое решение мне не подходит, к сожалению.


Слесарь Матерящийся   (2002-11-18 11:50:00) [15]

TStringList.Values[]


Наверх

Титульная страница Поиск, карта сайта Написать письмо