Текущий архив: 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