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

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

Как передавать глобальные параметры в процедуру? [D7, XP]


Страницы:   1 2

ZZZ ©   (2005-12-23 10:37:00) 

Добрый день. В Pascal'e есть возможность передачи глобальных парметров для процедуры, а в delphi имеется такая возможность?
Например мне надо сделать следующее:
есть несколько таблиц, есть кнопка delete record. по нажатии на эту кнопку появляется модальное окно на которой есть кнопка submit. мне необходимо определить у какой из 5-ти таблиц необходимо удалить запись.
Заранее благодарен.


ЮЮ   (2005-12-23 12:33:00) [1]

procedure TForm1.N1Click(Sender: TObject);
begin
  spSkinPageControl1.ActivePageIndex:=0;
  Label1.Caption:='11111';
end;

procedure TForm1.N1Click(Sender: TObject);
begin
  spSkinPageControl1.ActivePageIndex:=2;
  Label1.Caption:='2222';
end;

>В паскале это можно сделать примерно так:
>
>procedure TForm1.N_Click(var a:byte;var s:string);
>begin
>  spSkinPageControl1.ActivePageIndex:=a;
>  Label1.Caption:=s;
>end;

Кто мешает сделать это в Дельфи?
Ты же все равно где-то будешь её дваджы вызывать с разными параметрами.
Если ты их хочешь вызвать в обработчике клика двух разных пунктов меню, то так и вызовешь этот один метод, но с разными параметрами:

procedure TForm1.N1Click(Sender: TObject);
begin
  N_Click(0, '11111');
end;

procedure TForm1.N2Click(Sender: TObject);
begin
  N_Click(0, '11111');
end;

Более того - Sender - это тоже параметр. Если знания о том, кто вызвал этот обработчик достаточно, то он может быть один и тот же установлен как для N1, так и для N2 (не обязательно дважды кликать по пустому полю обработчика в ComponentEditor-е, там можно выбрать и уже существующие обраьотчики  

procedure TForm1.N1Click(Sender: TObject);
begin
  if Sender = N1 then begin;
    spSkinPageControl1.ActivePageIndex:=0;
    Label1.Caption:='11111';
 end
 else begin
   spSkinPageControl1.ActivePageIndex:=2;
   Label1.Caption:='2222';
 end;
end;


msguns   (2005-12-23 12:31:00) [2]

>ZZZ   (23.12.05 12:21) [18]

Пример функции, работающей с любым датасетом, отображаемом в активномгриде:

function DBServ_SearchRecordByField(Option: TSearchOption; RaiseErr: boolean): boolean;
// Функция ищет запись в открытом НД, отображаемом в гриде по значению текущего поля
//  (колонки грида) в напрвлении, указанном Option
var
 bm: TBookMark;
 val: variant;
 DS: TDataSet;
 Grid: TDBGrid;
begin
 result := false;
 if (Screen.ActiveControl=nil) or (Screen.ActiveControl.ClassType<>TDBGrid) then exit;
 Grid := TDBGrid(Screen.ActiveControl);
 DS := Grid.DataSource.DataSet;
 if (DS=nil) or not DS.Active or (DS.RecordCount<2) then exit;
 Screen.Cursor := crHourGlass;
 DS.DisableControls;
 DS.Tag := 1;
 bm := DS.GetBookmark;
 val := Grid.SelectedField.Value;
 if Option=soFirst then
   begin
    if DS.Locate(Grid.SelectedField.FieldName,Grid.SelectedField.Value,[]) then
      begin bm := DS.GetBookmark; result := true; end;
   end
 else
   if Option in [soNext,soLast] then
     begin
      DS.Next;
      while not DS.Eof do
        begin
         if Grid.SelectedField.Value=val then
           begin
            result := true;
            bm := DS.GetBookmark;     // Запомнить последнюю найденную
            if Option=soNext then break;
           end;
         DS.Next;
        end;
     end
   else
     begin
      DS.Prior;
      while not DS.Bof do
        begin
         if Grid.SelectedField.Value=val then
           begin
            result := true;
            bm := DS.GetBookmark;     // Запомнить первую найденную
            break;
           end;
         DS.Prior;
        end;
     end;
 DS.Tag := 0; DS.EnableControls; DS.GotoBookmark(bm); DS.FreeBookmark(bm);
 Screen.Cursor := crDefault;
 if not result and RaiseErr then ShowMessage('Образец не найден');
end;


Плохиш   (2005-12-23 12:29:00) [3]


> ZZZ   (23.12.05 12:07) [15]
> Короче, не могу вам доходчиво объяснить. постараюсь таким
> образом

И где тут удаление из "текущей таблицы". Пока не ответишь на [13], помочь тебе проблематично.


evvcom   (2005-12-23 12:24:00) [4]


> что не знаю как передать параметры, приходится писать онотипные
> процедуры но с разными параметрами

Можешь написать один обработчик для всех, а разруливать по TMyButton(Sender).Tag


evvcom   (2005-12-23 12:22:00) [5]


> опиши не в Published секции

это не важно, хотя принято в private, если больше нигде не используется в др. модулях


ZZZ   (2005-12-23 12:21:00) [6]

это был первый пример (тот что с кнопкой), а это другой.
Братва, дело не в кнопках и таблицах, проблема другая.
Из-за того , что не знаю как передать параметры, приходится писать онотипные процедуры но с разными параметрами (как в моем примере).


ЮЮ   (2005-12-23 12:14:00) [7]

procedure TForm1.N1Click(Sender: TObject);
begin
 N_Click(0, '11111');
end;

просто метод procedure TForm1.N_Click(var a:byte;var s:string);
опиши не в Published секции


Digitman   (2005-12-23 12:13:00) [8]

ты же сказал , что однакнопка у тебя ?


ZZZ   (2005-12-23 12:07:00) [9]

Короче, не могу вам доходчиво объяснить. постараюсь таким образом:
есть вот такие, например, процедуры:

procedure TForm1.N1Click(Sender: TObject);
begin
   spSkinPageControl1.ActivePageIndex:=0;
   Label1.Caption:='11111';
end;

procedure TForm1.N1Click(Sender: TObject);
begin
   spSkinPageControl1.ActivePageIndex:=2;
   Label1.Caption:='2222';
end;

В паскале это можно сделать примерно так:

procedure TForm1.N_Click(var a:byte;var s:string);
begin
  spSkinPageControl1.ActivePageIndex:=a;
  Label1.Caption:=s;
end;

В delphi я не знаю как передать эти параметры, и поэтому приходится писать каждый раз процедуру, в то время как процедура выполняет схожую задачу, нос разными параметрами. Надеюсь теперь понятно?


neat   (2005-12-23 12:06:00) [10]

> телепатируешь с бубном ?)

не с бубном, а с ZZZ. А что, запрещено?

Может ЮЮ и прав. Я предложил один вариант из множества возможных.


Digitman   (2005-12-23 11:59:00) [11]


> как вычислить какая таблица текущая?


определи критерий "текущей таблицы"


alex_***   (2005-12-23 11:58:00) [12]

Текущая в чем?


ZZZ   (2005-12-23 11:56:00) [13]

neat благодарю за помощь,
но мне надо сделать кое что другое, т.е. удалить запись у текущей таблицы (правильно Digitman подметил). Но вот как вычислить какая таблица текущая?


Digitman   (2005-12-23 11:53:00) [14]


> neat   (23.12.05 11:43) [8]
> Прямое


а где автор упомянул TTable ?

телепатируешь с бубном ?)


ЮЮ   (2005-12-23 11:48:00) [15]

не удаляй в модальной форме, а аналируй её ModalResult в том месте кода, где вызвал.


neat   (2005-12-23 11:43:00) [16]

> какое отношение он имеет к сабжу?

Прямое. Здесь что-то не понятно? Тогда подождём, что скажет ZZZ.


Плохиш   (2005-12-23 11:31:00) [17]


> neat   (23.12.05 11:12) [6]

Такой интересный код :-) Осталось только выяснить какое отношение он имеет к сабжу?

PS. Для чего использовать asпосле is?


neat   (2005-12-23 11:12:00) [18]

unit Unit1;

interface

uses
.
.
.

procedure TForm1.delete_recordClick(Sender: TObject);
begin
     Form2.ShowModal;
end;

unit Unit2;

interface

uses
.
.

implementation

uses unit1;

procedure TForm2.submitClick(Sender: TObject);
var i : integer;
   NameTable : string;
begin
    // Ввод идентификатора(имени) таблицы
    NameTable := Edit1.Text;
    for i := 0 to Form1.ComponentCount - 1 do
        if Form1.Components[i] is TTable then
            if NameTable = (Form1.Components[i] as TTable).Name then
                Form1.Components[i] as TTable).Delete;
end;


evvcom   (2005-12-23 11:01:00) [19]

Глобальные параметры и передавать никуда не надо, они и так доступны. На то они и глобальные.


Плохиш   (2005-12-23 10:59:00) [20]


> В Pascal'e есть возможность передачи глобальных парметров
> для процедуры

Можно поподробнее?


Страницы:   1 2

Наверх

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