Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.06;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.032 c
8-1109016115
Romantic
2005-02-21 23:01
2005.06.06
Облегчить TImage


1-1116529193
syte_ser78
2005-05-19 22:59
2005.06.06
форма нестандартной формы.


3-1114659400
Sergo
2005-04-28 07:36
2005.06.06
Confirm Delete


1-1116589938
juice
2005-05-20 15:52
2005.06.06
Как реализовать закрытие многопоточного приложения ?


3-1114688684
Dimedrol
2005-04-28 15:44
2005.06.06
Не исполняется stored proc. через ADO...