IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Обнуление RichEdit.Text через процедуру с параметрами (Delphi) (http://www.imho.ws/showthread.php?t=70973)

Interceptor 14.10.2004 09:06

Обнуление RichEdit.Text через процедуру с параметрами (Delphi)
 
У меня есть 8 форм типа RichEdit. Хочу создать несколько кнопок, по нажатию которой текст в сразу нескольких формах обнулялся. Ясно, что можно сделать, например, так:

Код:

RichEdit.Text:='';
Но я хочу обнулять через процедуру с параметрами: в качестве параметра - 2 перемеррые типа string:

Код:

Procedure Rev(var a:String; b:String);
begin
a:='';
b:='';
end;

procedure TForm1.Button4Click;
begin
      Rev(RichEdit1.Text, RichEdit2.Text)
end;

Компилятор выдаёт ошибку:
Цитата:

Constant object cannot be passed as var parameter
Понятно в чём дело, но непонятно как всё-таки можно реализовать обнуление теста в формах через процедуру.

ЕЖ 14.10.2004 09:46

Interceptor
Тебе надо передавать в процедуру не сами строки, а указатели на RichEdit'ы, а уже в самой процедуре обнулять им св-ва Text.

/7y3uK 14.10.2004 09:52

Interceptor

Во-первых, для обнуления TRichEdit нужно использовать его метод Clear. Например RichEdit1.Clear.

Во вторых, естественнов том виде, в котором ты написал процедуру, компилятор будет тебя ругать нехорошими словами, т.к. у тебя идет не совпадение типов. Если использовать твою процедуру, то можно написать так Rev(RichEdit1.Lines[номер строки], RichEdit2.Lines[номер строки]), но лучше, все-таки, чистить через Clear.

Вот например процедура, которая найдет на указанной форме все ричи и очистит их:

procedure ClearReaches(fm: TForm);
var
i: Cardinal;
begin
for i:=0 to fm.ControlCount-1 do
if fm.Controls[i].ClassNameIs('TRichEdit') then
(fm.Controls[i] as TRichEdit).Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClearReaches(Form1);
end;

Interceptor 14.10.2004 18:20

ЕЖ
Попытался сделать как ты сказал:

Код:

Procedure Rev(var a:PString; b:PString; c :PString);
begin
a:=nil;
b:=nil;
c:=nil;
end;

procedure TForm1.Button4Click(Sender: PObj);
begin
      Rev(RichEdit1.Text@, RichEdit2.Text@, RichEdit3.Text@);
end;

Компилятор пишет о несовместимости типов. Как по-другому можно передать указатель в процедуру?

/7y3uK
Цитата:

т.к. у тебя идет не совпадение типов
На сколько хватает моих познаний в английском компилятор пишет, что постоянный объект не может быть передан как ссылка на переменную.
Тем более, что типы у меня совпадают: просто я юзаю не VCL библиотеку, а её замену. И там RichEdit.Text имеет тип String.

Цитата:

Вот например процедура, которая найдет на указанной форме все ричи и очистит их:
Мне нужно чтоб не все поля очищались одной кнопкой, а одной кнопкой два, другой два и т.д.

/7y3uK 14.10.2004 18:53

Нет, я не понимаю... а что нет метода Clear? не может такого быть.

procedure ClrRich(a,b: TRichEdit);
begin
a.Clear;
b.Clear;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ClrRich(RichEdit1,RichEdit2);
end;

А так попробуй у себя в коде из топика в процедуре VAR стереть, и должно все заработать.

Interceptor 14.10.2004 19:28

/7y3uK
Цитата:

Нет, я не понимаю... а что нет метода Clear? не может такого быть.
Я пока разбирался тоже об этом подумал. Написал почти как у тебя, тока var в процедуре оставил: процедура должна работать с реальными переменными, а не их копиями. Всё заработало.

ЕЖ 15.10.2004 13:16

Interceptor
Я как раз и имел введу то, что вы сделали с /7y3uK в последних двух постах: передавать в процедуру указатель на сам RichEdit, а не на RichEdit1.Text. Когда ты ставишь var ("работать с реальными переменными"), ты фактически передаешь процедуре указатель на объект TRichEdit, а в процедуре вызываешь его метод очистки.


Часовой пояс GMT +4, время: 09:14.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.