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

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

Переменная в переменную [D7, XP]


Страницы:   1 2

SveTTT ©   (2007-11-11 17:04:00) 

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


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

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


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

Плохиш ©   (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 16:59:00) [3]


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

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


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

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

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

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

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


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


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

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

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


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

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

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

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


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

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

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


Leonid Troyanovsky   (2007-11-16 11:53:00) [8]


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

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

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

--
Regards, LVT.


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

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

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

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


Leonid Troyanovsky   (2007-11-16 11:18:00) [10]


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

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

--
Regards, LVT.


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

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

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


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

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

Т.е. в данном случае, если "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:41:00) [13]

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

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

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

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


Leonid Troyanovsky   (2007-11-16 10:23:00) [14]


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

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

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

--
Regards, LVT.


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


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


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

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

--
Regards, LVT.


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

> [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;


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


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

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


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

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

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


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

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


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;


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


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

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


Страницы:   1 2

Наверх

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