Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

Как удобнее оформит передачу массива записей в функцию   Найти похожие ветки 

 
ANB ©   (2005-05-19 10:37) [0]

Чего то я торможу.
Как удобнее оформит передачу массива записей в функцию в виде параметра, чтобы было попроще писать потом вызов.


 
Думкин ©   (2005-05-19 10:38) [1]

передавать открытый массив. Или динамический.
А что передавать хотим и как? Критерий простоты?


 
Ega23 ©   (2005-05-19 10:41) [2]

TList ?


 
ANB ©   (2005-05-19 10:47) [3]


> Думкин ©   (19.05.05 10:38) [1]
- желательно иметь возможность не создавать лишних переменных для того, чтобы передать список (например, описаний кнопок) в функцию. TList не пойдет. Его придется креатить и потом удалять. Некрасиво. В принципе, дурью маюсь. Решил в свой проект свой универсальный диалог запихать. Просьба не возмущаться, зачем мне это нужно. Повыеживаться решил, пока время есть. А то у апишных и делфовых, чуть чуть, да чего нибудь не хватает.


 
Думкин ©   (2005-05-19 10:49) [4]

> [3] ANB ©   (19.05.05 10:47)

Я не буду возмущаться. :)
Подробнее бы. Я считаю, что подробное расписывание проблемы первый и единственно первый шаг к решению задачи.


 
Ega23 ©   (2005-05-19 10:53) [5]

Его придется креатить и потом удалять. Некрасиво.

????

А GetMem c FreeMem - красиво?
А ДИНАМИЧЕСКИЙ список ты по-другому не передашь


 
ANB ©   (2005-05-19 10:55) [6]

Хочу нарисовать функцию, которая примет слудующие параметры :
Заголовок, текст, номер иконки, список кнопок.
Затем, по этим параметрам, она должна создать модальное окно и показать его.
Как все это делать - я знаю. Хочу функцию определить попроще, чтобы можно ее было за один оператор вызвать. Есть вариант, как у стандартного диалога - через set, тогда список кнопок можно будет задать просто [mbYes, mbNo], но тогда это список будет фиксированным и если кнопки не хватит, то придется опять править модуль. Описание кнопки можно задать записью иконка, текст. Список иконок можно фиксировать.


 
basken   (2005-05-19 10:55) [7]

procedure YouMethod(AYouArrayRecord: array of TYouArrayRecord);


 
ANB ©   (2005-05-19 10:55) [8]


> А GetMem c FreeMem - красиво?
- фи, а SetLength тогда зачем ?


 
ANB ©   (2005-05-19 10:57) [9]


> basken   (19.05.05 10:55) [7]
- я так и сделал. Но в этом варианте приходится создавать переменную типа array of TYouArrayRecord, инициализировать ее, и только потом передавать. У меня есть пример определиния статического массива записей прямо в коде, но у меня не получается запихать его, как параметр.


 
Ega23 ©   (2005-05-19 10:58) [10]

- фи, а SetLength тогда зачем ?

Вот и я о том - зачем?
Ты дескриптор формы (Заголовок, текст, номер иконки, список кнопок) можешь в класс запихнуть. Работать будет гораздо проще.


 
Думкин ©   (2005-05-19 10:58) [11]

>  [8] ANB ©   (19.05.05 10:55)

Опиши передаваемую структуру. Подробно и аккуратно - там и ответ.


 
Ega23 ©   (2005-05-19 11:00) [12]

У меня есть пример определиния статического массива записей прямо в коде, но у меня не получается запихать его, как параметр.

type
TMyArray = array of TYouArrayRecord;

procedure YouMethod(AYouArrayRecord: TMyArray);

?


 
Danilka ©   (2005-05-19 11:01) [13]

Что есть "список кнопок"? Просто, названия кнопок? Если да, то, как вариант, передавай одной строкой, используя какой-нибудь символ-разделитель.

А вообще - все это изврат. :)


 
ANB ©   (2005-05-19 11:01) [14]


> Ega23 ©   (19.05.05 10:58) [10]
- не кошерно. Придется объект креатить, настраивать, потом запускать. Много кода. И можно забыть его удалить. Тогда уж проще по стандартному пути пойти, через set.


 
ANB ©   (2005-05-19 11:03) [15]


> А вообще - все это изврат. :)
- а кто бы спорил :))) Но, согласись, когда нужно быстро вывести мессагу пользователю, то обычно ShowMessage юзаем. Потому что писать проще.


 
Ega23 ©   (2005-05-19 11:04) [16]

2 ANB ©   (19.05.05 11:01) [14]
- не кошерно. Придется объект креатить, настраивать, потом запускать. Много кода. И можно забыть его удалить. Тогда уж проще по стандартному пути пойти, через set.

Было бы предложено...


 
Ega23 ©   (2005-05-19 11:05) [17]

Но, согласись, когда нужно быстро вывести мессагу пользователю, то обычно ShowMessage юзаем.

Только для Debug Information. Для юзера стандартный MessageBox существует.


 
Думкин ©   (2005-05-19 11:05) [18]

> [14] ANB ©   (19.05.05 11:01)

Стоп. Ты про открытые таки прочитал? Или ты их с динамическими путаешь?


 
Думкин ©   (2005-05-19 11:06) [19]

Или как в открытых передавать сложные структуры вопрос теперь?


 
Ega23 ©   (2005-05-19 11:09) [20]

2 Думкин ©   (19.05.05 11:06) [19]
Или как в открытых передавать сложные структуры вопрос теперь?

Ты прям как Мастер Йода выражаешься!  :о)


 
Думкин ©   (2005-05-19 11:11) [21]

> [20] Ega23 ©   (19.05.05 11:09)

#ifdef offtop
В субботу идти намерение с сыном имеем и билеты уж взяты
#endif


 
Danilka ©   (2005-05-19 11:12) [22]

[20] Ega23 ©   (19.05.05 11:09)
> Мастер Йода

Йод, это шото типа зеленки, им болячки мажут, а хто такой мастер йоду - это мастер по замазыванию болячек? :)


 
Ega23 ©   (2005-05-19 11:13) [23]

В субботу идти намерение с сыном имеем и билеты уж взяты

Класс!!!  :-))))))))


 
ANB ©   (2005-05-19 11:14) [24]

RDlgButton = record
IconInd : Integer;
Caption : String;
end;

function ShowDialog (sTitle, sMessage : String; const Buttons : array of RDlgButton) : Integer;

procedure TForm2.Button1Click(Sender: TObject);
const Buttons : array [1..1] of RDlgButton = ((IconInd : 0; Caption : "OK"));
begin
ShowDialog("Заголовок","Мессага", Buttons);
end;

Вот так компиляется. Еще бы сделать без const, и было бы счастье.
Типа :
ShowDialog("Заголовок","Мессага", ((IconInd : 0; Caption : "OK")));


 
Ega23 ©   (2005-05-19 11:17) [25]

Ну тогда ещё нужно ссылку на метод передавать, который кнопке будешь присваивать.


 
Ega23 ©   (2005-05-19 11:18) [26]

function ShowTexLogFile(const aFileName:String):Boolean;
           procedure BtnClearClick(Sender:TObject);
           var
            i:Integer;
            _memo:TMemo;
           begin
            if (Sender is TForm) then
             begin
              With TForm(Sender) do
               begin
                for i:=0 to ComponentCount-1 do
                 if (Components[i] is TMemo) then
                  if UpperCase(TMemo(Components[i]).Name)=UpperCase("memSQLLogMonitor") then
                   begin
                    _memo:=TMemo(Components[i]);
                    _memo.Lines.Clear;
                    _memo.Lines.Add(" ");
                    _memo.Lines.SaveToFile(_memo.Hint);
                    Break;
                   end;
               end;//With TForm(Sender) do
             end;//if (Sender is TForm) then
           end;//procedure BtnClearClick(
var
aForm:TForm;
aPanel:TPanel;
OnClearClick:TMethod;
List:TStringList;
i:Integer;
begin
Result:=False;
//if not FileExists(aFileName) then Exit;
try
 Application.CreateForm(TForm, aForm);
 try
  With aForm do
   begin
    Caption:=aFileName;
    BorderStyle:=bsSingle;
    Height:=500;
    Width:=750;
    Position:=poScreenCenter;
   end;
  With TMemo.Create(aForm) do
   begin
    Parent:=aForm;
    Name:="memSQLLogMonitor";
    Align:=alClient;
    ScrollBars:=ssBoth;
    //Height:=440;
    Clear;
    Hint:=aFileName;
    List:=TStringList.Create;
    if FileExists(aFileName) then
     begin
      List.LoadFromFile(aFileName);
      for i:=List.Count-1 downto 0 do Lines.Add(List.Strings[i]);
     end;
    List.Free;
   end;
  aPanel:=TPanel.Create(aForm);
  With aPanel do
   begin
    Parent:=aForm;
    Height:=45;
    Align:=alBottom;
   end;
  With TButton.Create(aPanel) do
   begin
    Parent:=aPanel;
    Cancel:=True;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=10; //aPanel.ClientHeight-10;
    Left:=aPanel.Width-110;
    Anchors:=[akTop, akRight];
    Caption:="Закрыть";
    ModalResult:=mrOK;
   end;
  With TButton.Create(aPanel) do
   begin
    Parent:=aPanel;
    Height:=25;
    Width:=100;
    Font.Size:=10;
    Top:=10; //aPanel.ClientHeight-30;
    Left:=aPanel.Width-220;
    Anchors:=[akTop, akRight];
    Caption:="Очистить";
    OnClearClick.Code:=@BtnClearClick;
    OnClearClick.Data:=aForm;
    OnClick:=TNotifyEvent(OnClearClick);
   end;
  aForm.ShowModal;
 finally
  aForm.Free;
 end;
except on E:Exception do
 raise Exception.Create("ShowTexLogFile "+E.Message);
end;
end;


 
ANB ©   (2005-05-19 11:20) [27]


> Ну тогда ещё нужно ссылку на метод передавать, который кнопке
> будешь присваивать.
- это, а зачем ? Номер кнопки я могу определить и вернуть.
А чего этот код у тебя делает ?


 
basken   (2005-05-19 11:22) [28]


> ANB ©   (19.05.05 11:01) [14]


Напиши классовый метод для своего диалогового окна с нужными тебе параметрами, и вызывай его как обычную процедуру...


 
ANB ©   (2005-05-19 11:23) [29]


> basken   (19.05.05 11:22) [28]
- да вот в описании параметров и все проблемы. Сабж читал ?


 
ANB ©   (2005-05-19 11:24) [30]


> Напиши классовый метод
- да и не нужен тут классовый. Потом придется имя класса постоянно прикручивать.


 
Ega23 ©   (2005-05-19 11:24) [31]

А чего этот код у тебя делает ?
Выводит на экран содержимое текстового файла в мемо. Также есть 2 кнопки - "Очистить" и "Закрыть".

- это, а зачем ? Номер кнопки я могу определить и вернуть.
Ну и что? А где "реакция" на кнопку?


 
basken   (2005-05-19 11:26) [32]


> ANB ©   (19.05.05 11:24) [30]

Что значить прикручивать...?


 
Думкин ©   (2005-05-19 11:26) [33]

Хм. Навскидку пока не вижу. А гемор вижу. :)


 
ANB ©   (2005-05-19 11:30) [34]


> Также есть 2 кнопки - "Очистить" и "Закрыть".
- хе, этто слишком просто. 2 кнопки. А если мне нужна одна ? Кнопки на панельку динамически накидать я и сам умею. Мнеж надо передать - какие. Минимумом кода. Кстати, помнится была такая фича - открытый список аргументов, кажись в TP. Delphi это ест ?


 
Ega23 ©   (2005-05-19 11:31) [35]

2 ANB ©   (19.05.05 11:30) [34]

Короче, заведи Set и не мучайся, если с классами возиться неохота (или не умеешь)


 
ANB ©   (2005-05-19 11:33) [36]


> (или не умеешь)
- не, скорее не люблю. Ну не торчу я от ООП. Хотя в реализации все равно придется с ними возится.


 
Думкин ©   (2005-05-19 11:36) [37]

> [34] ANB ©   (19.05.05 11:30)

Пипец. Я же тебе пишу - открытые массивы. А просто открытого - ничего и в ТП не было.


 
Ega23 ©   (2005-05-19 11:36) [38]

- не, скорее не люблю. Ну не торчу я от ООП. Хотя в реализации все равно придется с ними возится.

А как же тогда Form1.Button1 ?  :о)


 
Думкин ©   (2005-05-19 11:37) [39]

Variant open array parameters - то?


 
ANB ©   (2005-05-19 11:38) [40]


> А как же тогда Form1.Button1 ?  :о)
- вот и грю же, не люблю, а приходится.


> А просто открытого - ничего и в ТП не было.
, млин, может я с TC перепутал . . . Давненько не нужно было.


 
ANB ©   (2005-05-19 11:38) [41]


> Думкин ©   (19.05.05 11:37) [39]
- а прототяп и вызов функции сможешь накидать ?


 
Думкин ©   (2005-05-19 11:43) [42]

> [41] ANB ©   (19.05.05 11:38)

Да пробую покрасивее. Колбаса пока.
Посмотри что привел по F1.


 
Reindeer Moss Eater ©   (2005-05-19 11:45) [43]

Есть вариант, как у стандартного диалога - через set, тогда список кнопок можно будет задать просто [mbYes, mbNo], но тогда это список будет фиксированным и если кнопки не хватит, то придется опять править модуль.

Передавай в свою функцию только скалярные параметры.
Для списка кнопок передай callback функцию.
Создаваемая форма вызовет ее.
А сами кнопки создашь в колбэке.

Универсально и просто.


 
ANB ©   (2005-05-19 11:48) [44]


> Reindeer Moss Eater ©   (19.05.05 11:45) [43]
- ну нагородил. Еще и callback функцию цеплять. Да мне тогда проще константу определить, как в коде.


 
Reindeer Moss Eater ©   (2005-05-19 11:50) [45]

Мой вариант - самый простой.
Не надо городить сложных структур данных.
Плюс взаимная зависиость модулей уменьшается.


 
ANB ©   (2005-05-19 11:51) [46]


> Думкин ©   (19.05.05 11:43) [42]

- точно, Variant open array parameters - самое оно. Ща попробую.


 
ANB ©   (2005-05-19 11:52) [47]


> Думкин ©   (19.05.05 11:43) [42]
- все, копиляется !!! Выложить ?


 
Думкин ©   (2005-05-19 12:06) [48]

> [47] ANB ©   (19.05.05 11:52)

Я твоя внешняя совесть? %)


 
Polevi ©   (2005-05-19 12:19) [49]

xml


 
Думкин ©   (2005-05-19 12:21) [50]

> [49] Polevi ©   (19.05.05 12:19)

"Пъясните пжалуста"(с)


 
Reindeer Moss Eater ©   (2005-05-19 12:23) [51]

Чо тут пояснять?
Передать xml документ как строку


 
Alexander Panov ©   (2005-05-19 12:23) [52]


function ShowDialog (sTitle, sMessage : String; const Buttons : array of RDlgButton) : Integer;

function DlgButton(IconInd : Integer; Caption : String):RDlgButton;
begin
 Result.IconInd := IconInd;
 Result.Caption := Caption;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowDialog("Заголовок","Мессага",[DlgButton(1,"Ok"),DlgButton(2,"Cancel")]);
end;


 
Думкин ©   (2005-05-19 12:26) [53]

> [51] Reindeer Moss Eater ©   (19.05.05 12:23)

Ба. Ну в общем в концепцию автора выдирания гланд через ... вкладывается.


 
GrayFace ©   (2005-05-19 13:12) [54]

Reindeer Moss Eater ©   (19.05.05 11:50) [45]
Мой вариант - самый простой.
Не надо городить сложных структур данных.
Плюс взаимная зависиость модулей уменьшается.

Гы. Всего-то делов - написать для каждой кнопочки по процедуре! Я болдею.


 
Reindeer Moss Eater ©   (2005-05-19 13:18) [55]

Для каждой кнопочки по процедуре пишут только болдеющие.
Я же пишу всего одну на все кнопки.


 
Polevi ©   (2005-05-19 13:56) [56]

>Думкин ©   (19.05.05 12:26) [53]
ну а мне кажется что "концепция автора" как раз и есть "выдирания гланд через ..."
:)


 
Думкин ©   (2005-05-19 14:02) [57]

> [56] Polevi ©   (19.05.05 13:56)

Согласен. Поэтому и согласился. Вписывается.
:)


 
ANB ©   (2005-05-19 14:05) [58]


> Polevi ©   (19.05.05 13:56) [56]
- ой да ладно. Поразвлечься уже нельзя. Ну лень мне постоянно писать Create try finally FreeAndNil и еще параметры засовывать. Все же юзают MessageDlg и подобное. И многие пишут такие примочки, как я хочу.
А вариант

> Alexander Panov ©   (19.05.05 12:23) [52]
- весьма интересен, щас попробую.


 
GrayFace ©   (2005-05-20 13:09) [59]

Reindeer Moss Eater ©   (19.05.05 13:18) [55]
Для каждой кнопочки по процедуре пишут только болдеющие.
Я же пишу всего одну на все кнопки.

Тогда надо передавать массив параметров(имена кнопок) и проблема остается.


 
evvcom ©   (2005-05-20 13:20) [60]

2ANB: А чем тебе в const не нравится? Перечисляешь все в объявлениях, а код не нагружаешь лишними инициализациями. Я так часто делаю и согласен, что это очень удобно. И все нормально работает.


 
GrayFace ©   (2005-05-20 13:21) [61]

ANB
Интересно будет взглянуть на пресловутую процедуру. Отправь мне (sergroj@hotbox.ru, sergroj@mail.ru), как готово будет.

ANB ©   (19.05.05 11:03) [15]
Но, согласись, когда нужно быстро вывести мессагу пользователю, то обычно ShowMessage юзаем. Потому что писать проще.

Нет. Лично я юзаю msgz - моя процедурка с одним (иногда двумя) параметром основных типов.



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.012 c
3-1113923414
mozart
2005-04-19 19:10
2005.06.06
Как лучше организовать "шахматку"


14-1116271689
dazfx
2005-05-16 23:28
2005.06.06
Программа для сканирования сети


3-1114505812
MakNik
2005-04-26 12:56
2005.06.06
Сравнение строк


1-1116485300
Polenov
2005-05-19 10:48
2005.06.06
Выделить строчку айтема в листбоксе


1-1116596614
Alex870
2005-05-20 17:43
2005.06.06
TStringGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский