Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Отношения массива с Edit


Автор: Миринда 3.11.2012, 17:07
Существует ли возможность присвоить  содержимому поля Edit  имя одномерного массива с тем смыслом, чтобы впоследствии можно было по этому имени вызвать содержимое этого Эдита ?

Автор: Чучмек 3.11.2012, 18:00
как это должно выглядеть?

Автор: Миринда 3.11.2012, 18:09
Вопрос, который мучает меня, никак не получается самой решить:
Как сделать, чтобы щелчком по кнопке "Обучение" введенное в Эдит8 название объекта соответствовало массиву "v" (массив формируется щелчками чекбоксов). 
Смысл этого - нужно чтобы это название объекта, было распознано в Эдит21, если ввести по одной цифре массива "v" в Эдиты с 13-го по 18-й и нажать на кнопку "Экспертиза".
Вот мой проект:

Автор: Чучмек 3.11.2012, 18:37
Тебе нужно сопоставить имя - массиву?

Автор: Миринда 3.11.2012, 18:49
Ну вообщем, да

Автор: Чучмек 3.11.2012, 19:43
Попробуй вот это
Код

type
ppropstype=^tpropstype;
tpropstype=string;//!!! Это может быть любой тип какой тебе нужен

pNameRec=^tNameRec;
tNameRec=record
 name:string;
 props:tpropstype;
 end;



TNameList=class
 private
  mNameObj:array of tNameRec;
  fCount:integer;
  function GetObjInd(name: string):integer;
  function GetObjByName(name: string): ppropstype;
 public
  property count:integer read fCount;
  property objs[name:string]:ppropstype read GetObjByName; default;
  function GetObjName(ind:integer):string;
  property Names[ind:integer]:string read GetObjName;
  function Add(name:string):ppropstype;
  function Delete(name:string):boolean;
  constructor create;
 end;



{ TNameList }

function TNameList.Add(name: string): ppropstype;
begin
if GetObjInd(name)>=0 then  //если объект с таким именем уже существует
 begin
 Result:=nil;
 exit;
 end;
if Length(mNameObj)>=fCount then SetLength(mNameObj,Length(mNameObj)+32);
mNameObj[fCount].name:=name;
result:=@(mNameObj[fCount].props);
inc(fCount);
end;

constructor TNameList.create;
begin
fCount:=0;
end;

function TNameList.Delete(name:string):boolean;
var ind:integer;
begin
ind:=GetObjInd(name);
if ind>=0 then
 begin
 Dec(fCount);
 mNameObj[ind]:=mNameObj[fCount];
 Result:=true;
 end else Result:=false;
end;

function TNameList.GetObjByName(name: string): ppropstype;
var ind:integer;
begin
ind:=GetObjInd(name);
if ind>=0 then
  result:=@(mNameObj[ind].props) else
  result:=nil;
end;

function TNameList.GetObjInd(name: string): integer;
var i:integer;
begin
for i:=0 to fCount-1 do
 if 0 = AnsiCompareText(name,mNameObj[i].name) then break;     //AnsiCompareStr
if i<fCount then result:=i else result:=-1;
end;

function TNameList.GetObjName(ind: integer): string;
begin
if (ind<0) and (ind>=fCount) then result:='' else Result:=mNameObj[ind].name
end;


Автор: Миринда 3.11.2012, 20:35
Да уж. Программа интересна, но по-моему не для новичков. Я даже не знаю что значит это: p^
Но постараюсь разобраться в ней.
Думаю у меня будут вопросы. Пока что соображаю что спросить

Автор: Чучмек 3.11.2012, 21:34
Цитата(Миринда @  3.11.2012,  20:35 Найти цитируемый пост)
Я даже не знаю что значит это: p^

http://www.igrif.org/programmizm/ukazateli-v-delphi/
p это переменная, в которую сохраняется указатель(адрес в памяти) на данные объекта.
Например

1:
Код

var m:array[0..maxind]of type1;
function Get(ind:integer):type1;
begin
result:=m[ind];
end;
...
var
 v1:type1;
begin
 v1:=Get(1); //в v1 будет копия данных из m[1]

 
2:
Код

type
 pType1=^Type1
var m:array[0..maxind]of type1;
function Get(ind:integer):ptype1;
begin
result:=@(m[ind]);
end;
...
var
 p:ptype1;
 v1,v2:type1
begin
 p:=Get(1);//в p будет указатель на  m[1] 
 v1:=p^;//В v1 будут данные из m[1]
 p^:=v2;//В m[1] скопируються данные из v2
 
Первый пример скопирует данные из ячейки  массива
Второй вернет указатель на ячейку 

Автор: Миринда 6.11.2012, 22:53
 Уважаемый, даже язык не поворачивается вас так назвать,Чучмек. Ваша программа несомненно интересна (почти курсовой проект!) и она мне очень помогла. Не скрою что мне очень трудно было понять ваш код без комментариев, но я свою работу практически сделала. Очень благодарна вам за помощь. Не смогла найти здесь на форуме кнопку, чтобы добавить вам веса в вашей репутации. Если знаете подскажите как, я это обязательно сделаю.

Автор: Данкинг 6.11.2012, 23:06
Цитата(Миринда @  6.11.2012,  23:53 Найти цитируемый пост)
Если знаете подскажите как, я это обязательно сделаю.

Я уже сделал. smile 

Автор: Чучмек 17.11.2012, 20:48
Миринда, более сложный(правильный) пример интересует?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)