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

Вниз

Как передавать глобальные параметры в процедуру?   Найти похожие ветки 

 
ZZZ   (2005-12-23 10:37) [0]

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


 
Digitman ©   (2005-12-23 10:47) [1]


> у какой из 5-ти таблиц необходимо удалить запись


у текущей, разумеется


 
alex_*** ©   (2005-12-23 10:49) [2]

а как связано определение нужной таблицы со способом передачи параметров? В чем вопрос-то?


 
Digitman ©   (2005-12-23 10:52) [3]

и что такое "таблица" ?


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


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

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


 
evvcom ©   (2005-12-23 11:01) [5]

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


 
neat   (2005-12-23 11:12) [6]

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;


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


> neat   (23.12.05 11:12) [6]

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

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


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

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

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


 
ЮЮ ©   (2005-12-23 11:48) [9]

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


 
Digitman ©   (2005-12-23 11:53) [10]


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


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

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


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

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


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

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


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


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


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


 
neat   (2005-12-23 12:06) [14]

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

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

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


 
ZZZ   (2005-12-23 12:07) [15]

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

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 я не знаю как передать эти параметры, и поэтому приходится писать каждый раз процедуру, в то время как процедура выполняет схожую задачу, нос разными параметрами. Надеюсь теперь понятно?


 
Digitman ©   (2005-12-23 12:13) [16]

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


 
ЮЮ ©   (2005-12-23 12:14) [17]

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

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


 
ZZZ   (2005-12-23 12:21) [18]

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


 
evvcom ©   (2005-12-23 12:22) [19]


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

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


 
evvcom ©   (2005-12-23 12:24) [20]


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

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


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


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

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


 
msguns ©   (2005-12-23 12:31) [22]

>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:33) [23]

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;



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

Текущий архив: 2006.01.15;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1135420209
Pazitron_Brain
2005-12-24 13:30
2006.01.15
Мой вопрос:


14-1135083553
DeMoN-777
2005-12-20 15:59
2006.01.15
Рассеянность


3-1131523769
Juice
2005-11-09 11:09
2006.01.15
Скопировать поля набора данных


1-1134119330
DUDAS
2005-12-09 12:08
2006.01.15
Invalid typecast


2-1135535261
Spe@ker
2005-12-25 21:27
2006.01.15
работа с базой данных