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

Вниз

А как передать данные из ОДНОЙ процедуры в ДРУГУЮ?   Найти похожие ветки 

 
CoolLamer   (2007-01-06 20:06) [0]

Дорова МАСТЕРА!
Подскажите ЛАМЕРУ как данные из:
Procedure AAA ()
Begin
...
End;


передать в процедуру

Procedure ВВВ ()
Begin
...
Procedure AAA ()
...
End;

учитывая что вторая запускает первую??
Спасиб!


 
Sergey Masloff   (2007-01-06 20:11) [1]

1) Через параметры (нужно)
2) Через глобальные переменные (плохо но иногда допустимо)


 
CoolLamer   (2007-01-06 20:12) [2]

1) Через параметры - то как? Примерчик можно?


 
Джо ©   (2007-01-06 20:16) [3]

> учитывая что вторая запускает первую??

В бесконечеую рекурсию войти не боишься?


> 1) Через параметры - то как? Примерчик можно?

У процедур есть параметры.


 
Virgo_Style ©   (2007-01-06 20:18) [4]

После имени процедур и функций бывают скобочки, а в них буковки, вот эти буковки описывают имена и типы параметров энтих процедур и функций


 
kaZaNoVa ©   (2007-01-06 20:19) [5]

CoolLamer   (06.01.07 20:12) [2]
глобальные переменнные лучше юзай!!!!!

а пример
Procedure ВВВ ()
Begin
...
Procedure AAA (var dannie:integer)
...
End;


 
CoolLamer   (2007-01-06 20:19) [6]

Эт понятно, что у процедуры есть параметры, "типа" Аргрументы и Результаты?
А как определить кто вызывает ПРОЦЕДУРУ??? Какой ОБЪЕКТ?


 
Джо ©   (2007-01-06 20:21) [7]

> [6] CoolLamer   (06.01.07 20:19)
> А как определить кто вызывает ПРОЦЕДУРУ??? Какой ОБЪЕКТ?

А зачем?


 
CoolLamer   (2007-01-06 20:21) [8]

Надо! : )) Или этого нельзя сделать?


 
kaZaNoVa ©   (2007-01-06 20:23) [9]

CoolLamer   (06.01.07 20:21) [8]
можно, когда вызываешь, говори ий об этом) (через параметр)


 
MsGuns ©   (2007-01-06 20:23) [10]

>kaZaNoVa ©   (06.01.07 20:19) [5]

Чушь хватит молоть по веткам-то, а ?


 
CoolLamer   (2007-01-06 20:26) [11]


> Чушь хватит молоть по веткам-то, а ?

ЛЕЧИТ МЕНЯ, ДА?


 
Virgo_Style ©   (2007-01-06 20:26) [12]

Еще иногда можно таким образом

procedure TForm1.Button1Click(Sender: TObject);
var LogStr:String;

 procedure AddToLog;
 begin
   Memo1.Lines.Add(LogStr);
 end;

begin
 LogStr:="Поехали";
 AddToLog;
 ...
end;

P.S. Я не удивлюсь, кстати, если автору на самом деле результат работы вызванной функции вернуть надо.


 
Джо ©   (2007-01-06 20:26) [13]

> [8] CoolLamer   (06.01.07 20:21)
> Надо! : )) Или этого нельзя сделать?

А где вообще в твоем примере хотья какой-то «объект»?


 
CoolLamer   (2007-01-06 20:30) [14]

ЭТО Grid, просто я вызываю Grid из процедуры ААА, и хочу знать какую строку ВЫБРАЛИ в процедуре ВВВ.


 
Virgo_Style ©   (2007-01-06 20:36) [15]

1. Параметры
2. Grid в данном случае вполне похож на глобальную переменную %-)


 
MsGuns ©   (2007-01-06 20:37) [16]

Про обмен данными с процедурами и функциями, а также область видимости читать в делфишной справке или у Тексейро.

"Правильные" процедуры (функции) это такие программные блоки кода, которые по идее не должны интересоваться кто их вызвал, откуда и зачем. Это как почтальон, в обязанности которого входит вовремя доставить адресату послание, а вовсе не проверка грамматическимх ошибок.
Исключения составляют методы класса, которые могут работать непосредственно с некоторыми свойствами, методами или событиями этого класса.
В общем случае Паскаль не ограничивает программиста в выборе стратегии разбивки (модулирования) кода, поэтому иногда целесообразно совмещение этих двух стилей. В этом случае удобно передавать в процедуру указатель на соответствующий объект (дескриптор), поля которого ею и заполняются. Вызывающая функция на "выходе" анализирует содержимое дескриптора объекта и поступает дале по алгоритму.


 
CoolLamer   (2007-01-06 20:38) [17]


> 1. Параметры
> 2. Grid в данном случае вполне похож на глобальную переменную
> %-)

А можно примерчик МАЛЮСЕНЬКИЙ?


 
MsGuns ©   (2007-01-06 20:38) [18]

>CoolLamer   (06.01.07 20:30) [14]
>ЭТО Grid, просто я вызываю Grid из процедуры ААА, и хочу знать какую >строку ВЫБРАЛИ в процедуре ВВВ.

Код на стол !


 
CoolLamer   (2007-01-06 20:39) [19]


> MsGuns ©   (06.01.07 20:37) [16]


8 ]


 
MsGuns ©   (2007-01-06 20:49) [20]

> 2. Grid в данном случае вполне похож на глобальную переменную

???


 
CoolLamer   (2007-01-06 20:57) [21]

ТАК КАК В НУТРИ ПРОЦЕДУРЫ, ОПРЕДЕЛИТЬ ОБЪЕКТ КОТОРЫЙ ЕЕ ВЫЗЫВАЕТ???


 
Virgo_Style ©   (2007-01-06 21:01) [22]

MsGuns ©   (06.01.07 20:49) [20]
???


> Исключения составляют методы класса, которые могут
> работать непосредственно с некоторыми свойствами,
> методами или событиями этого класса.


Примерно это я и имел в виду. Или с некоторым зубовным скрежетом можно и непосредственно к SomeForm.SomeGrid обратиться из процедуры, если не предполагается несколько экземпляров этой формы, и если вообще говорить о глобальных переменных. Ясное дело, это не есть хорошо, но такое впечатление, что эту кашу даже этаким маслом уже не испортить %-)

Хотя что конкретно нужно автору - до сих пор остается загадкой.


 
Virgo_Style ©   (2007-01-06 21:04) [23]

CoolLamer   (06.01.07 20:57) [21]

1. Никак.
2. Передать его параметром.
3. Сделать процедуру методом класса.


 
CoolLamer   (2007-01-06 21:04) [24]


> Хотя что конкретно нужно автору - до сих пор остается загадкой

Я разобрался по ВОПРОСУ уже СПАСИБО!
Другой возник последний....
КАК ВНУТРИ ИСПОЛНЯЕМОЙ ПРОЦЕДУРЫ ОПРЕДЕЛИТЬ ЕЕ "РОДИТЕЛЯ", кто ее вызвал и вообще, например чтобы изминить свойство этого ОБЪЕКТА, например CAPTION


 
Джо ©   (2007-01-06 21:06) [25]

> [24] CoolLamer   (06.01.07 21:04)
> КАК ВНУТРИ ИСПОЛНЯЕМОЙ ПРОЦЕДУРЫ ОПРЕДЕЛИТЬ ЕЕ "РОДИТЕЛЯ",
> кто ее вызвал и вообще, например чтобы изминить свойство
> этого ОБЪЕКТА, например CAPTION

Ответы смотри:
[23] Virgo_Style ©   (06.01.07 21:04)


 
CoolLamer   (2007-01-06 21:08) [26]


> 2. Передать его параметром.

В смысле САМ объект?


 
Джо ©   (2007-01-06 21:09) [27]

> [26] CoolLamer   (06.01.07 21:08)
>
> > 2. Передать его параметром.
>
> В смысле САМ объект?

Объекты в Делфи всегда передаются по ссылке.


 
Kolan ©   (2007-01-06 21:11) [28]

«ОПРЕДЕЛИТЬ ЕЕ „РОДИТЕЛЯ“»

Зачем же ток орать?


 
CoolLamer   (2007-01-06 21:11) [29]


> Объекты в Делфи всегда передаются по ссылке.


Точно, простите НЕВЕЖУ!!!!

Может НИСПОШЛЕТЕ более ламерским ЯЗЫКОМ?? : (


 
CoolLamer   (2007-01-06 21:14) [30]

А ЕСЛИ Я СОЗДАЛ ОБЪЕКТ КОДОМ, ПОТОМ ЕГО ПРОЦЕДУРУ, ну например КНОПКУ, потом ПРИСВОИЛ ЕЙ ПРОЦЕДУРУ onClick, как мне при нажатии изминить ее Caption?


 
MsGuns ©   (2007-01-06 21:24) [31]

Читать про Sender, Owner, операторы as и is, преобразование T<ClassName> и вообще введение в RTTI


 
CoolLamer   (2007-01-06 21:26) [32]

8 ]
КОПЕЦ!!!
А примерчик КАКОЙНИТЬ не можно??


 
Virgo_Style ©   (2007-01-06 21:26) [33]

тот, кто вызвал обработчик - это параметр Sender


 
Virgo_Style ©   (2007-01-06 21:28) [34]

procedure TForm1.Button1Click(Sender: TObject);
begin
 ShowMessage("Тут надо документацию читать, а не на "+(Sender as TButton).Caption+" жать!");
end;


 
CoolLamer   (2007-01-06 21:29) [35]

Эт я СЛАВО БОГУ догадался, я не знаю как реализовать в ПРОГРАММе : (
То есть например
Procedure TBitBtn.Click(Sender: TObject);
begin
 ????.caption="ПриВЕТ"
куда тут СЕНДЕР писать?
end;


 
kaZaNoVa ©   (2007-01-06 21:29) [36]

а в чем, совственно, проблема?


 
CoolLamer   (2007-01-06 21:30) [37]

: (


 
CoolLamer   (2007-01-06 21:33) [38]


> а в чем, совственно, проблема?

Создал ОБЪЕКТ TBitBtn
Cnopka:=TBitBtn(...);
Cnopka.OnClick:=ClickAAA;

procedure TBitBtn.ClickAAA(Sender: TObject);
begin
ТУТ ХОЧУ ИЗМЕНИТЬ НАДПИСТЬ НА КНОПКЕ!!!!
end;


 
MsGuns ©   (2007-01-06 21:34) [39]

Вот пример, где в функцию передается указатель на TDBGrid. Функция работает с датасетом, связанным с этим гридом. При этом ей (функции) глубого "фиолетово", на какой форме (классе, юните и т.д.) этот грид находится.


type
 TSearchOption = (soFirst,soLast,soNext,soPrior);
..
function DBServ_SearchRecordByField(Grid: TDBGrid; Option: TSearchOption; RaiseErr: boolean): boolean;
// Функция ищет запись в открытом НД, отображаемом в гриде по значению текущего поля
//  (колонки грида) в напрвлении, указанном Option
var
 bm: TBookMark;
 val: variant;
 DS: TDataSet;
begin
 result := false;
 if not Grid.Focused then exit;
 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 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;     // Запомнить первую найденную
          if Option=soPrior then 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;


 
Virgo_Style ©   (2007-01-06 21:35) [40]

Сначала caps почини и книжки почитай. Можно наоборот, сначала книжки, потом caps.
Если дело срочное, то можно это отложить на потом, а сейчас временно прекратить писать и начать читать.



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

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

Наверх




Память: 0.57 MB
Время: 0.053 c
15-1168167674
ogi123
2007-01-07 14:01
2007.01.28
Python


15-1167910472
Kostya_86
2007-01-04 14:34
2007.01.28
dbase


15-1168438608
vasIzmax
2007-01-10 17:16
2007.01.28
"...свиные консервы..." :)


15-1168103024
Nic
2007-01-06 20:03
2007.01.28
Turbo Delphi страсть как хочется :)


11-1127366651
TRUF
2005-09-22 09:24
2007.01.28
Drag&amp;Drop