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

Вниз

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

 
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.
Если дело срочное, то можно это отложить на потом, а сейчас временно прекратить писать и начать читать.


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


> MsGuns ©   (06.01.07 21:34) [39]

НАКОНЕЦ ТО ХОТЬ КАКОЙТо КОД!!! СПАСИБО ГРОМАДНОЕ!


 
MsGuns ©   (2007-01-06 21:46) [42]

>CoolLamer   (06.01.07 21:33) [38]
>procedure TBitBtn.ClickAAA(Sender: TObject);
>begin
>ТУТ ХОЧУ ИЗМЕНИТЬ НАДПИСТЬ НА КНОПКЕ!!!!
>end;

Sender в Delphi используется для стандартизации обозначения инициатора события в процедурах-обратотчиках событий (TNotifyEvent и подобные)

Использовать его иногда чрезвычайно полезно. Например, когда один обработчик назначен нескольким "похожим" объектам. Допустим, надо сделать так, чтобы цвет вводимых символов во ВСЕХ эдитах менялся на красный, как только пользователь начал туда что-то вводить и становился обычным, как только курсор уходил из эдита в другой контрол. Таких контролов на форме может быть надцать штук. Так вот, написав всего лишь пару обработчиков

procedure TForm1.EditOnChange(Sender: TObject);
begin
 TEdit(Sender).Font.Color := clRed;
end;

procedure TForm1.EditOnExit(Sender: TObject);
begin
 TEdit(Sender).Font.Color := clWindowText;
end;


и назначив эти обаботчики ВСЕМ эдитам, мы получим эффект одинаковой реакции всех эдитов, как и требовалось. Если цвет надо с красного поменять на синий, меняем в единственном месте кода, и ВСЕ Эдиты начинают красить фонт по-новому.

Если контролы не только эдиты, но и объекты других классов (TMemo, TMaskEdit,TCombobox и т.д.), но краситься они должны по этому же принципу, то можно эти обработчики "повесить" и на события этих контролов, однако в этом случае код самих обработчиков надо слегка "подшаманить", научив его самостоятельно определять тип и класс объекта, к нему обатившегося. Это уже пример RTTI.


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

ОПАНА!!!

> MsGuns ©   (06.01.07 21:46) [42]

ОТ ДУШИ СПАСИБО, ВОТ ЭТО Я И ИСКАЛ!!!!


 
CoolLamer   (2007-01-06 22:09) [44]


> MsGuns ©   (06.01.07 21:46) [42]

ОТ ДУШИ, все РАБОТАЕТ!!!! ТЫ МАСТЕР 100 ПУДОВ!!!!


 
CoolLamer   (2007-01-06 22:09) [45]


> MsGuns ©   (06.01.07 21:46) [42]

ОТ ДУШИ, все РАБОТАЕТ!!!! ТЫ МАСТЕР 100 ПУДОВ!!!!


 
CoolLamer   (2007-01-06 22:12) [46]

НУ и Virgo_Style, kaZaNoVa, Kolan, Джо, Sergey Masloff ШИРОКИЙ RESPEKT!!!!


 
MetalFan_pda   (2007-01-07 00:38) [47]

Автор!чини капслок!или ты блондинка?


 
Плохиш ©   (2007-01-07 00:52) [48]

Читал ветку, рыдал....


 
MsGuns ©   (2007-01-07 00:58) [49]

>Плохиш ©   (07.01.07 00:52) [48]
>Читал ветку, рыдал....

Поделись над чем, тоже вот взрыднуть захотелось ;)


 
Плохиш ©   (2007-01-07 01:05) [50]


> MsGuns ©   (07.01.07 00:58) [49]
> Поделись над чем, тоже вот взрыднуть захотелось

Над попытками объяснить детсадовцу основы квантовой механики ;-)


 
MsGuns ©   (2007-01-07 01:21) [51]

>Плохиш ©   (07.01.07 01:05) [50]

Мне было не до смеха ;(



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

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

Наверх




Память: 0.58 MB
Время: 0.069 c
2-1168229678
Рекорд
2007-01-08 07:14
2007.01.28
Как быстро скопировать record ?


15-1168256520
Empleado
2007-01-08 14:42
2007.01.28
Что можно показать иностранцам?


8-1149096765
Михайлов Антон
2006-05-31 21:32
2007.01.28
прогрессив скин


15-1168314028
Sergey Masloff
2007-01-09 06:40
2007.01.28
Не такая великая как тайна воды но прикольно


4-1158316591
R_O_O_T
2006-09-15 14:36
2007.01.28
помогите с SETUPAPI.dll )))





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский