Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2008, 17:52   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Именовать элементы массива не цифрами, а словами.

Здравствуйте.

Столкнулся с проблемой.
Как именовать элементы массива не цифрами (буквами), а словами?

Пример.
Код:
...
Arr['Slovo1']:='C:\1';
Arr['Slovo2']:='C:\Windows';
Arr['papka']:='C:\Games';
...
(Всё взято условно.)

Заранее благодарен.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 06.03.2008, 17:56   #2
andrey4623
Форумчанин
 
Аватар для andrey4623
 
Регистрация: 31.05.2007
Сообщений: 266
По умолчанию

можно структуру создать в разделе type
tmystruct = record
str1, str2, ... , strN:string;
end;

а потом объявить переменную типа tmystruct
andrey4623 вне форума Ответить с цитированием
Старый 06.03.2008, 18:07   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Да! Если б я точно знал сколько мне их нужно.

Я пишу функцию, которая будет регистрировать расширения в системе, если я создам только 5, то не смогу задать больше, а если 50, будут лишние "пустые" операции.

А динамически, случаем ни как нельзя типы создавать?

я использую вот что, - переменной массива является команда будуюшего файл, а в TStringList её параметры (иконка и т.п.)
Код:
CommandList:array of TStringList
Всё гениальное - просто!

Последний раз редактировалось Air; 06.03.2008 в 18:11.
Air вне форума Ответить с цитированием
Старый 06.03.2008, 19:47   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Динамический массив, а какой тип элементов это на твое усмотрение, своего типа тоже можно.

А вообще я что-то такое встречал в Дельфи, когда в диалоге выбора цвета ковырялся. Но там типа констант, динамически нельзя.

Это:
Цитата:
tmystruct = record
str1, str2, ... , strN:string;
end;
можно сделать в таком виде:
Код:
TElement = record
  Name: string; // 'Slovo1'
  Text: string; // 'C:\1'
  ...
  end;

tmystruct = record
strings: array of TElement;
end;
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 06.03.2008 в 19:58.
mutabor вне форума Ответить с цитированием
Старый 06.03.2008, 19:55   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Динамический массив, а какой тип элементов это на твое усмотрение, своего типа тоже можно.
То есть так?

Код:
Type
TStruct = record
 Str1:string;
 Str2:String;
end;
...
Var Y:array of TStruct;
Код:
Function SetExp(Exp,ProgrammWay,IconWay:string; CommandList:array of TStringList):boolean;
Другими словами я хотел бы организовать всё в одной функции, но для этого надо строго разграничить все параметры.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 06.03.2008, 20:09   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Другими словами я хотел бы организовать всё в одной функции, но для этого надо строго разграничить все параметры.
Можешь вообще создать структуру к-рая будет содержать в себе всё и один параметр в функцию передавать
Function SetExp(NewExp: TMyExp): boolean;
а все вместе расширения будут array of TMyExp

Вобщем тебе виднее.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 06.03.2008 в 20:12.
mutabor вне форума Ответить с цитированием
Старый 06.03.2008, 20:10   #7
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,085
По умолчанию

как вариант можно в TStringList хранить. там же для каждой строки можно хранить еще какое-либо значение. пусть оно будет строкой. поиск по строке как раз есть.
или глянуть можно как сделан TValueListEditor. там вроде как то, что нужно
pu4koff вне форума Ответить с цитированием
Старый 06.03.2008, 20:12   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Можно реализовать как отдельный класс
Вот примерная схема:

Код:
type
   TParamInfo = class
      str1 : String;
      str2 : String;
   end;

   TParamList = class
   private
      FList : TStrings;
      function getParam(S:String):TParamInfo;
   public
      property Items[S:String] : TParamInfo read getParam; default;
      procedure AddParam(S:String; Str1, Str2:String);
   end;

function TParamList.getParam(S:String):TParamInfo;
var N:integer;
begin
   N := FList.indexof(S);
   if N >= 0
   then result := TParamInfo(FList.objects[N])
   else result := nil;
end;

procedure TParamList.AddParam(S:String; Str1, Str2:String);
var P:TParamInfo;
begin
   P := TParamInfo.create;
   P.Str1 := Str1;
   P.str2 := Str2;
   FList.add(S);
   FList.objects[FList.count] := P;
end;

// Реализация займет какое-то время, зато как просто использовать:

var List : TParamList;
    P:TParamInfo;
begin
   List := TParamList.Create;
   List.AddParam('word1', '1', '2');
   P := List['word1'];
alexBlack вне форума Ответить с цитированием
Старый 06.03.2008, 23:11   #9
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Огромное Всем спасибо, я кажется даже поумнел немного

А это результат работы. (я называю это пока что "Сырой код", т.к. недавно написал), пожалуйсто, оцените.

На счёт отдельного класса, надо прицениться.

Код:
type
TStruct = record
 NameCommand:string;
 description:string;
 Way:String;
end;

...
Function SetExp(Exp,ProgrammWay,IconWay:string; CommandList:array of TStruct):boolean;
Label 1;
var e:TRegistry; ExpInd:string; i:integer;
begin
e:=TRegistry.Create;
e.RootKey:=HKEY_CLASSES_ROOT;

if Exp[1] <> '.' then Exp:='.' + Exp;
if not e.OpenKey(Exp,false) then
 e.OpenKey(Exp,true)
else
 begin
  if application.MessageBox('Расширение существует, заменить?',
      'Подтверждение перезаписи',4+MB_IconInformation)=6 then goto 1;
  e.Free;
  exit;
 end;
1:
ExpInd:=Exp;
delete(ExpInd,1,1);
e.WriteString('',ExpInd+'File');
e.CloseKey;

e.OpenKey(ExpInd+'File',true);
e.WriteString('',ExpInd+' File');
e.OpenKey('DefaultIcon',true);
e.WriteString('',IconWay+',0');
e.CloseKey;

for i:=0 to length(CommandList)-1 do
 begin
  e.OpenKey(ExpInd+'File\shell',true);
  e.WriteString('',CommandList[i].NameCommand);
  e.OpenKey(CommandList[i].NameCommand,true);
  e.WriteString('',CommandList[i].description);
  e.OpenKey('command',true);
  e.WriteString('',CommandList[i].Way+' %1');
  e.CloseKey;
 end;
Result:=true;
e.CloseKey;
e.Free;
end;

Function GetExp(Exp:string):boolean;
var e:TRegistry;
begin
e:=TRegistry.Create;
e.RootKey:=HKEY_CLASSES_ROOT;
if Exp[1] <> '.' then Exp:='.' + Exp;
Result:=e.OpenKey(Exp,false);
e.CloseKey;
e.Free;
end;

Function DelExp(Exp:string):boolean;
var e:TRegistry; ExpInd:string;
begin
Result:=false;
e:=TRegistry.Create;
e.RootKey:=HKEY_CLASSES_ROOT;

if Exp[1] <> '.' then Exp:='.' + Exp;
if not e.DeleteKey(Exp) then
 begin
  e.Free;
  Exit;
 end;
ExpInd:=Exp;
delete(ExpInd,1,1);
e.DeleteKey(ExpInd+'File');
Result:=true;
e.CloseKey;
e.Free;
end;
Использование.
Код:
procedure TForm1.Button1Click(Sender: TObject); //регистрация
var r:array[0..2] of TStruct;
begin
{обязательно писать в обратном порядке, результат = Открыть,
Редактировать, Печать.  "Открыть" - будет активным.}

r[0].NameCommand:='Print';
r[0].Way:='C:\3.exe'; // это просто так, здесь должна быть команда
r[0].description:='Печать';

r[1].NameCommand:='Edit';
r[1].Way:='C:\2.exe';
r[1].description:='Редактировать';

r[2].NameCommand:='Open';
r[2].Way:='C:\1.exe';
r[2].description:='Открыть';

SetExp('000',paramstr(0),paramstr(0),r);
end;

procedure TForm1.Button2Click(Sender: TObject); // Проверка
begin
if GetExp('000') then showmessage('1');
end;

procedure TForm1.Button3Click(Sender: TObject); // Удаление
begin
if DelExp('000') then showmessage('2');
end;
польуйтесь, может кому понадобится.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 06.03.2008, 23:58   #10
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
пожалуйсто, оцените
использование GOTO считается архаизмом, к тому же с ним код становится менее понятным, больше вероятность допустить ошибку
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повторяющиеся элементы массива Stanislav Общие вопросы Delphi 10 23.05.2008 12:31
Элементы массива и старшие цифры logistics Помощь студентам 4 22.04.2008 00:12
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44
Как удалять элементы массива в Паскале? Антонова Анна Помощь студентам 2 08.12.2007 17:01
элементы массива заносились в ListBox при этом располагались в столбик?! Ensoph Компоненты Delphi 3 14.09.2007 11:49