![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переменная в переменную [D7, XP]
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]
> Но может нужно пересмотреть алгорит программы, например
> разбить на подпрограммки и вместо глобальной переменной
> использовать одноименную функцию строкового типа....
Спасибо, не успела сразу поблагодарить!