imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 14.10.2004, 09:06     # 1
Interceptor
Banned
 
Аватар для Interceptor
 
Регистрация: 04.09.2002
Адрес: В сети ;)
Сообщения: 783

Interceptor Давно пора выгнатьInterceptor Давно пора выгнатьInterceptor Давно пора выгнатьInterceptor Давно пора выгнать
Обнуление 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
Понятно в чём дело, но непонятно как всё-таки можно реализовать обнуление теста в формах через процедуру.
Interceptor вне форума  
Старый 14.10.2004, 09:46     # 2
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

ЕЖ Бог с наворотамиЕЖ Бог с наворотами
ЕЖ Бог с наворотамиЕЖ Бог с наворотами
Interceptor
Тебе надо передавать в процедуру не сами строки, а указатели на RichEdit'ы, а уже в самой процедуре обнулять им св-ва Text.
ЕЖ вне форума  
Старый 14.10.2004, 09:52     # 3
/7y3uK
Advanced Member
 
Аватар для /7y3uK
 
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498

/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)
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;
/7y3uK вне форума  
Старый 14.10.2004, 18:20     # 4
Interceptor
Banned
 
Аватар для Interceptor
 
Регистрация: 04.09.2002
Адрес: В сети ;)
Сообщения: 783

Interceptor Давно пора выгнатьInterceptor Давно пора выгнатьInterceptor Давно пора выгнатьInterceptor Давно пора выгнать
ЕЖ
Попытался сделать как ты сказал:

Код:
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.

Цитата:
Вот например процедура, которая найдет на указанной форме все ричи и очистит их:
Мне нужно чтоб не все поля очищались одной кнопкой, а одной кнопкой два, другой два и т.д.
Interceptor вне форума  
Старый 14.10.2004, 18:53     # 5
/7y3uK
Advanced Member
 
Аватар для /7y3uK
 
Регистрация: 09.03.2004
Адрес: толстозадая Москва
Сообщения: 498

/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)/7y3uK Реально крут(а)
Нет, я не понимаю... а что нет метода Clear? не может такого быть.

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

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

А так попробуй у себя в коде из топика в процедуре VAR стереть, и должно все заработать.
/7y3uK вне форума  
Старый 14.10.2004, 19:28     # 6
Interceptor
Banned
 
Аватар для Interceptor
 
Регистрация: 04.09.2002
Адрес: В сети ;)
Сообщения: 783

Interceptor Давно пора выгнатьInterceptor Давно пора выгнатьInterceptor Давно пора выгнатьInterceptor Давно пора выгнать
/7y3uK
Цитата:
Нет, я не понимаю... а что нет метода Clear? не может такого быть.
Я пока разбирался тоже об этом подумал. Написал почти как у тебя, тока var в процедуре оставил: процедура должна работать с реальными переменными, а не их копиями. Всё заработало.
Interceptor вне форума  
Старый 15.10.2004, 13:16     # 7
ЕЖ
::VIP::
 
Регистрация: 19.03.2004
Сообщения: 1 329

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


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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