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

Вниз

Переменная в переменную   Найти похожие ветки 

 
SveTTT   (2007-11-11 17:04) [0]

Возможно ли результат, фиксируемый переменной из одной процедуры использовать в качестве переменой в другой процедуре? Другими словами использовать в качестве переменной результат полученный в другой процедуре.


 
{RASkov}   (2007-11-11 17:09) [1]

> [0] SveTTT   (11.11.07 17:04)

Ты кодом это продемонстрируй, а то что-то непонятно....
Может после написания куска кода у тебя и вопрос-то сам отпадет)


 
Kolan ©   (2007-11-11 17:17) [2]

Если правильно понял то тыбе нужно использовать ф-цию:

function MyFoo: string;
begin
 Result := "10"; //результат, фиксируемый переменной из одной процедуры
end;

procedure MyProc;
var
 S: srting;
begin
 S := MyFoo; //использовать в качестве переменой в другой процедуре
 ShowMessage(S);
end;


 
Zeqfreed ©   (2007-11-11 18:47) [3]

Может быть вопрос о SomeFunc(AnotherFunc(...), ...)?


 
Amoeba ©   (2007-11-11 18:56) [4]


> Kolan ©   (11.11.07 17:17) [2]
>
> Если правильно понял то тыбе нужно использовать ф-цию:

Скорее всего, что понял неправильно. Вопрос, судя по всему, был о процедурах и их параметрах-переменных.


 
SveTTT   (2007-11-11 22:01) [5]


> Ты кодом это продемонстрируй, а то что-то непонятно....

Определяем значение исходя из выполнения определенного условия
procedure TTRF_MAIN.L;
var i:integer;
   s:string;
   a:boolean;
begin
...

if a then
s:="100";

else
...
  end;


используем "S" в
procedure TTRF_MAIN.StatusBar2DrawPanel(StatusBar: TStatusBar;
 Panel: TStatusPanel; const Rect: TRect);
var
 SomeText: string;

begin

  if Panel = StatusBar2.Panels[0] then
  begin
    SomeText := s;
Panel.Width := Trunc(StatusBar2.Canvas.TextWidth(SomeText) * 1.5);
    with StatusBar.Canvas do
     begin
      Brush.Color := clWhite;
      FillRect(Rect);
      Font.Name  := "Arial";
      Font.Color := clRed;
     // Font.Style := Font.Style + [fsItalic, fsBold];
      TextRect(Rect, Rect.Left + 1, Rect.Top, SomeText);
    end;


Так вот! Надо, чтобы при выполнении условия в первом коде, переменная S отображалась в процедуре заполнения statusBar"а.


 
Amoeba ©   (2007-11-11 22:04) [6]

Сделай S или глобальной переменной, или полем (можно и свойством) класса TTRF_MAIN.

RTFM о видимости переменных.


 
SveTTT   (2007-11-11 22:08) [7]

Глобальной делала, только ничего не отображается.


 
DrPass ©   (2007-11-11 22:17) [8]


> Глобальной делала, только ничего не отображается.

А после того, как сделала, не забыла удалить ее отсюда?
procedure TTRF_MAIN.L;
var i:integer;
  s:string;
  a:boolean;
begin


 
SveTTT   (2007-11-11 22:27) [9]

конечно не забыла.

и что такое "RTFM о видимости переменных"


 
{RASkov}   (2007-11-11 22:49) [10]

> [9] SveTTT   (11.11.07 22:27)

В итоге должно получится нечто такое:

var SomeText: String;

procedure TTRF_MAIN.L;
var i:integer;
   a:boolean;
begin
...
if a then SomeText:="100" else SomeText:="А=False:)";
...
end;

procedure TTRF_MAIN.StatusBar2DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
 if Panel = StatusBar2.Panels[0] then
 begin
   Panel.Width := Trunc(StatusBar2.Canvas.TextWidth(SomeText) * 1.5);
   with StatusBar.Canvas do
    begin
     Brush.Color := clWhite;
     FillRect(Rect);
     Font.Name  := "Arial";
     Font.Color := clRed;
    // Font.Style := Font.Style + [fsItalic, fsBold];
     TextRect(Rect, Rect.Left + 1, Rect.Top, SomeText);
   end;


Но может нужно пересмотреть алгорит программы, например разбить на подпрограммки и вместо глобальной переменной использовать одноименную функцию строкового типа.... В общем в твоем случае варианты есть...)


> и что такое "RTFM о видимости переменных"

:) мануал, ттх, хелп, справка, помощь, F1, книги....)


 
SveTTT   (2007-11-13 19:08) [11]


> Но может нужно пересмотреть алгорит программы, например
> разбить на подпрограммки и вместо глобальной переменной
> использовать одноименную функцию строкового типа....

Спасибо, не успела сразу поблагодарить!


 
SveTTT   (2007-11-16 00:07) [12]

Итогом (рабочим) стало:


var SomeText: String;

procedure TTRF_MAIN.L;
var i:integer;
    s:string;
    a:boolean;
begin
SomeText:=s;

...
if a then
s:="...";
else
...
end;

procedure TTRF_MAIN.StatusBar2DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
if Panel = StatusBar2.Panels[0] then
begin
  Panel.Width := Trunc(StatusBar2.Canvas.TextWidth(SomeText) * 1.5);
  with StatusBar.Canvas do
   begin
    Brush.Color := clWhite;
    FillRect(Rect);
    Font.Name  := "Arial";
    Font.Color := clRed;
    TextRect(Rect, Rect.Left + 1, Rect.Top, SomeText);
  end;



 
{RASkov}   (2007-11-16 00:51) [13]

А зачем так делать:
> var SomeText: String;
>
> procedure TTRF_MAIN.L;
> var i:integer;
>    s:string;
>    a:boolean;
> begin
> SomeText:=s;

?
не нужна локальная s.


 
Германн ©   (2007-11-16 02:28) [14]


> SveTTT   (13.11.07 19:08) [11]
>
>
> > Но может нужно пересмотреть алгорит программы, например
> > разбить на подпрограммки и вместо глобальной переменной
> > использовать одноименную функцию строкового типа....
>
> Спасибо, не успела сразу поблагодарить!
> <Цитата>
>
> SveTTT   (16.11.07 00:07) [12]
>
> Итогом (рабочим) стало:
>
>
> var SomeText: String;
>
>

И итогом стала глобальная переменная!???


 
{RASkov}   (2007-11-16 09:59) [15]

> [14] Германн ©   (16.11.07 02:28)
> И итогом стала глобальная переменная!???

По ее ТЗ - это один из вариантов решения...:)


> SveTTT

Я бы наверное поступил все ж так:

 property SomeText: String read FSomeText; // В классе Формы

procedure TTRF_MAIN.L; // L - Super Name :)
var i: integer;
   a: boolean;
begin
...
if a then FSomeText:="100" else FSomeText:="А=False:)";
...
end;

procedure TTRF_MAIN.StatusBar2DrawPanel(StatusBar: TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
if Panel = StatusBar2.Panels[0] then
begin
  Panel.Width := Trunc(StatusBar2.Canvas.TextWidth(SomeText) * 1.5);
  with StatusBar.Canvas do
   begin
    Brush.Color := clWhite;
    FillRect(Rect);
    Font.Name  := "Arial";
    Font.Color := clRed;
   // Font.Style := Font.Style + [fsItalic, fsBold];
    TextRect(Rect, Rect.Left + 1, Rect.Top, SomeText);
  end;


 
Leonid Troyanovsky ©   (2007-11-16 10:15) [16]


> SveTTT   (16.11.07 00:07) [12]
> Итогом (рабочим) стало:


Оч. плохо. Глобальные переменные - MD.
Сделай SomeText полем (свойством) TTRF_MAIN.

Если имелось ввиду только для чтения, то можно сделать
метод-функцию GetSomeText(..): String.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-11-16 10:23) [17]


> {RASkov}   (16.11.07 09:59) [15]

> if a then FSomeText:="100" else FSomeText:="А=False:)";

Это тоже весьма подозрительно.
Т.е., либо это const SomeText: array [Boolean] of String =("..", "..");
Либо должна быть какая-то реакция формы на изменение этого "a".

--
Regards, LVT.


 
{RASkov}   (2007-11-16 10:41) [18]

> [17] Leonid Troyanovsky ©   (16.11.07 10:23)
> Т.е., либо это const SomeText: array [Boolean] of String =("..", "..");

Может быть.... Ну в "темноте" трудно найти правильную дорогу.... (мало инфы).
Мы же не делаем за нее программу, а предложили варианты решения ее "проблемы".
Как вариант - пусть рассмотрит
:)

> Либо должна быть какая-то реакция формы на изменение этого "a".

:) там у нее в процедуре "L" стоят "..." где, наверное, и меняется "а" )
Ну и L наверное где-то в программе вызывается...


 
{RASkov}   (2007-11-16 10:54) [19]

> Как вариант - пусть рассмотрит

Т.е. в данном случае, если "a:bool" необходима быть локальной переменной в "proc L", то нечто такое решение реализации "L":

procedure TTRF_MAIN.L;
const ArSomeTxt: array [Boolean] of String = ("100", "А=False:)");
var i: integer;
   a: boolean;
begin
...
 FSomeText:=ArSomeTxt[a];
...
end;


Можно и другое решение:

const ArSomeTxt: array [Boolean] of String = ("100", "А=False:)");

нечто
 TTRF_MAIN = class
   NekoeA: Boolean;
   function GetTxt: String;
   procedure L;
   peoperty SomeTxt: String read GetTxt;
 end;

function GetTxt: String;
begin
 Result:=ArSomeTxt[NekoeA];
end;

procedure L;
begin
// Ну и соответственно здесь меняем НекоеА....
end;


 
{RASkov}   (2007-11-16 10:57) [20]

> const ArSomeTxt: array [Boolean] of String = ("100", "А=False:)");

Гы.... наоборот )
const ArSomeTxt: array [Boolean] of String = ("А=False:)", "100");


 
Leonid Troyanovsky ©   (2007-11-16 11:18) [21]


> {RASkov}   (16.11.07 10:41) [18]

Ну, да. Два подхода именно так и выглядят:
либо каждый раз при нужде в SomeText мы его вычисляем,
либо в момент изменения "a", в качестве побочного эффекта,
устанавливаем новое значение свойству SomeText.

--
Regards, LVT.


 
{RASkov}   (2007-11-16 11:34) [22]

> [21] Leonid Troyanovsky ©   (16.11.07 11:18)
> либо каждый раз при нужде в SomeText мы его вычисляем

Ни в одном из моих вариантов нет вычисления "каждый раз"
так как нам SomeText нужна в отрисовки статусбара, то в первом случае при выполнении один раз L мы значение SomeText храним в FSomeText
а во втором случае храним индекс этого значения... а функцией просто "дергаем" строку из массива по сохраненному индексу, который был вычеслен в L

Впрочем данный пост адресован автору вопроса как комментарий к посту [21], т.е. его строке - "каждый раз при нужде в SomeText мы его вычисляем".
Другими словами при нужде в SomeText мы просто обращаемся к одноименному свойству, а при нужде изменения данного свойства вызываем процедуру L.


 
Leonid Troyanovsky ©   (2007-11-16 11:53) [23]


> {RASkov}   (16.11.07 11:34) [22]

> вызываем процедуру L.

Да, вообще, она здесь не нужна :)
Либо метод-функция, либо обработчик события,
которое приводит к изменению "a".  

--
Regards, LVT.


 
{RASkov}   (2007-11-16 12:06) [24]

> Да, вообще, она здесь не нужна :)

Процедура L - это образно. Пусть я и имел ввиду метод класса... не важно лишь бы он был.
Мое мнение и мои пояснения:
Если вычисление значения SomeText занимает не много ресурсов, то можно, да, вообще убрать этот метод и сделать все в функции read свойства
т.е.
function GetSomeText: String;
property SomeText: String: read GetSomeText;
но если это длительный процесс то лучше вычислить и хранить значение и в этом случае L необходима
а кем она будет(методом или обр.события) это не столь важно или другими словами зависит от задачи.
Во как:)


 
Галинка ©   (2007-11-16 14:50) [25]

а что мешает из процедуры сделать функцию?

function TTRF_MAIN.L : string;
var i:integer;
   s:string;
   a:boolean;
begin
SomeText:=s;

...
if a then
Result := "...";
else
...
end;


 
StriderMan   (2007-11-16 15:02) [26]


> Галинка ©   (16.11.07 14:50) [25]
а что мешает из процедуры сделать функцию?

ну вот, первая здравая мысль

а то какие-то глобальные переменные, поля... жуть!


 
{RASkov}   (2007-11-16 16:48) [27]

> [26] StriderMan   (16.11.07 15:02)
> ну вот, первая здравая мысль
>
> а то какие-то глобальные переменные, поля... жуть!

Она такая же здравая как и все остальные, а если внимательно читать, то уже такая мысль была.

С другой стороны, если для получения строки производятся большие вычисления, а строка используется в отрисовки статусбара, то зачем каждый раз, для перерисовки, делать вычисления что б получить текст строки....

Так что на здравость она не претендует :)


 
Плохиш ©   (2007-11-16 16:59) [28]


> Галинка ©   (16.11.07 14:50) [25]
> а что мешает из процедуры сделать функцию?
>
> function TTRF_MAIN.L : string;
> var i:integer;
>    s:string;
>    a:boolean;
> begin
> SomeText:=s;

Вот так и множат глюкодромы :-(


 
Галинка ©   (2007-11-16 17:48) [29]

Плохиш ©   (16.11.07 16:59) [28]

точно. Это убрать.  Просто вернуть нужную строку. И не надо глобальных переменных.

Но классовый подход тоже правомерен. Смотря что подразумевается под "...".

но для использования в такой конструкции:

Panel.Width := Trunc(StatusBar2.Canvas.TextWidth(SomeText) * 1.5);

Проще было бы сделать:

Panel.Width := Trunc(StatusBar2.Canvas.TextWidth(GetText()) * 1.5);

а вот GetText() решить в виде функции.

А вот отчего зависит вид строки, автор умалчивает.


 
Галинка ©   (2007-11-16 17:58) [30]

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



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

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

Наверх




Память: 0.55 MB
Время: 0.022 c
15-1194273247
Ferra
2007-11-05 17:34
2007.12.09
Программирование в команде...


2-1195222506
йцукенЫЧ
2007-11-16 17:15
2007.12.09
Как найти компонент TImage в данном случае?


11-1180182392
VPBar
2007-05-26 16:26
2007.12.09
Ошибка TStrListEx.DeleteLast ??


15-1194968623
IOrist
2007-11-13 18:43
2007.12.09
Почиму в орешнике 1 страница?


2-1194880387
Новичок
2007-11-12 18:13
2007.12.09
Как правильно организовать связь между таблицами