![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как работать с property типа TStrings [D7, WinXP]
Dr.TurboBoa © (2006-05-19 12:27:00)Люди! Мне нужно написать компонент для шыфрования текста. У меня готов UNIT с процедурами, но хотелось бы зделать его в виде компонента( TCommponent). Когда я это попытался зделать то увидел что при попытке редактирования из среды разработки property типа TStrings, Delphi выдает ошибку с текстом "Cannot assign a nil to a TRichEditStrings" что это значит и как с этим бороться?
Loginov Dmitry (2006-05-25 11:54:00) [1]Dr.TurboBoa © (24.05.06 17:24) [7]
function TCoder.GetStringsIN : TStrings;
begin
Result:=TStringList.Create;
Result:=FStringsIN;
end;
function TCoder.GetStringsOUT : TStrings;
begin
Result:=TStringList.Create;
Result:=FStringsOUT;
end;
Что енто все означает? Кашмааар!
Нужно примерно следующее:
constructor TCoder.Create;
begin
FStringsIN := TStringList.Create;
end;
procedure TCoder.SetStringsIN(New : TStrings);
begin
FStringsIN.Assign(New);
end;
function TCoder.GetStringsIN : TStrings;
begin
Result := FStringsIN;
end;
Сергей М. (2006-05-25 09:15:00) [2]
> Как работать с property типа TStrings
Посмотри на св-во TMemo.Lines в stdctrls.pas и разберись, как это д.б. реализовано в коде компонента и как это в итоге работает
Сергей М. (2006-05-25 09:11:00) [3]
> Dr.TurboBoa © (24.05.06 17:24) [7]
Код никуда не годится - в нем масса грубыхошибок.
См. [4]
Dr.TurboBoa (2006-05-24 17:24:00) [4]Код в полном варианте. Попробуй вставить на форму компонент и отредактировать свойства StringsIN:
unit Coder;
interface
uses
SysUtils, Classes;
type
TCoder = class(TComponent)
private
{ Private declarations }
FStringsIN : TStrings;
FStringsOUT : TStrings;
//constructor Create;
//destructor Destroy;
function GetStringsIN : TStrings;
function GetStringsOUT : TStrings;
procedure SetStringsIN(New : TStrings);
protected
{ Protected declarations }
function StrsCoding(Input : TStrings) : TStrings;
function StrCoding(Input : String) : String;
function CharCoding(Input : char) : char;
public
{ Public declarations }
procedure Execute; overload;
function Execute(Input : TStrings): TStrings; overload;
published
{ Published declarations }
property StringsIN : TStrings read GetStringsIN
write SetStringsIN;
property StringsOUT : TStrings read GetStringsOUT;
end;
const num=187;
var
TableIN : array[1..187] of char=( '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '|', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '', '?', 'ё', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\', 'й', 'ц', 'у', 'к', 'е', 'н', 'г', 'ш', 'щ', 'з', 'х', 'ъ', 'ф', 'ы', 'в', 'а', 'п', 'р', 'о', 'л', 'д', 'ж', 'э', 'я', 'ч', 'с', 'м', 'и', 'т', 'ь', 'б', 'ю', '.', 'Ё', '!', '"', '№', ';', '%', ':', '?', '*', '(', ')', '_', '+', '/', 'Й', 'Ц', 'У', 'К', 'Е', 'Н', 'Г', 'Ш', 'Щ', 'З', 'Х', 'Ъ', 'Ф', 'Ы', 'В', 'А', 'П', 'Р', 'О', 'Л', 'Д', 'Ж', 'Э', 'Я', 'Ч', 'С', 'М', 'И', 'Т', 'Ь', 'Б', 'Ю', ',' );
TableOUT : array[1..187] of char=( '1', 'q', 'a', 'z', '2', 'w', 's', 'x', '3', 'e', 'd', 'c', '4', 'r', 'f', 'v', '5', 't', 'g', 'b', '6', 'y', 'h', 'n', '7', 'u', 'j', 'm', '8', 'i', 'k', ',', '9', 'o', 'l', '.', '0', 'p', ';', '/', '-', '[', '=', ']', '\', '`', '!', 'Q', 'A', 'Z', '@', 'W', 'S', 'X', '#', 'E', 'D', 'C', '$', 'R', 'F', 'V', '%', 'T', 'G', 'B', '^', 'Y', 'H', 'N', '&', 'U', 'J', 'M', '*', 'I', 'K', '', ')', 'P', ':', '?', '_', '{', '"', '+', '}', '|', '~', '1', 'й', 'ф', 'я', '2', 'ц', 'ы', 'ч', '3', 'у', 'в', 'с', '4', 'к', 'а', 'м', '5', 'е', 'п', 'и', '6', 'н', 'р', 'т', '7', 'г', 'о', 'ь', '8', 'ш', 'л', 'б', '9', 'щ', 'д', 'ю', '0', 'з', 'ж', '.', '-', 'х', 'э', '=', 'ъ', '\', 'ё', '!', 'Й', 'Ф', 'Я', '"', 'Ц', 'Ы', 'Ч', '№', 'У', 'В', 'С', ';', 'К', 'А', 'М', '%', 'Е', 'П', 'И', ':', 'Н', 'Р', 'Т', '?', 'Г', 'О', 'Ь', '*', 'Ш', 'Л', 'Б', '(', 'Щ', 'Д', 'Ю', ')', 'З', 'Ж', ',', '_', 'Х', 'Э', '+', 'Ъ', '/', 'Ё' );
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('My', [TCoder]);
end;
function TCoder.CharCoding(Input : char) : char;
var
c : integer;
begin
CharCoding:='0';
for c:=1 to num do
begin
if TableIN[c]=Input then
begin
CharCoding:=TableOUT[c];
end;
end;
end;
function TCoder.StrCoding(Input : String) : String;
var
f : textfile;
fn : String;
buf : char;
OutStr : String;
begin
OutStr:='';
StrCoding:='Nothing was coded';
fn:='D:\1.txt';
AssignFile(f, fn);
Rewrite(f);
Write(f, Input);
CloseFile(f);
Reset(f);
While not Eof(F) do
begin
Read(f, buf);
OutStr:=OutStr+CharCoding(buf);
end;
closefile(f);
StrCoding:=OutStr;
end;
function TCoder.StrsCoding(Input : TStrings) : TStrings;
var
c : integer;
begin
Result:=TStringList.Create;
for c:=0 to input.Count do
begin
Result.Add(StrCoding(Input.Strings[c]));
end;
end;
procedure TCoder.Execute;
begin
FStringsOUT:=StrsCoding(FStringsIN);
end;
function TCoder.Execute(Input : TStrings): TStrings;
begin
Result:=TStringList.Create;
Result:=StrsCoding(Input);
end;
function TCoder.GetStringsIN : TStrings;
begin
Result:=TStringList.Create;
Result:=FStringsIN;
end;
function TCoder.GetStringsOUT : TStrings;
begin
Result:=TStringList.Create;
Result:=FStringsOUT;
end;
procedure TCoder.SetStringsIN(New : TStrings);
begin
FStringsIN:=New;
FStringsIN.Assign(New);
end;
end.
Яся (2006-05-21 16:25:00) [5]С телепатией проблема.
То, что я вижу - это не код, а какой-то черновик.
Для начала в нем вообще нет никаких published свойств, а значит OI и показывать нечего, не то что редактировать.
> "Cannot assign a nil to a TRichEditStrings
Откуда здесь RichEdit взялся?
Что еще осталось за кадром?
Dr.TurboBoa (2006-05-21 12:43:00) [6]
> Кошмар
> Result:=TStringList.Create; - без этого exeption при получении значения(Как можно получать ссылка на не существующею область памяти!)
> Result:=FStringsIN;
> Зачем создавать TStringList, чтобы тут же потерять на него
> ссылку?
> FStringsIN:=New;
> FStringsIN.Assign(New) своя копия надежнее будет - разницы никакой! Просто некоторые думают что метод Assign коректней!
А что конкретно ты предлагаеш зделать? Я пытался переделать код с учетом твоего совета. Все та же ошибка!!! Проблема в том, что из Object Inspector не редактируеться хотя при запуске работаэт нормально!
Яся (2006-05-20 17:40:00) [7]Кошмар
Result:=TStringList.Create;
Result:=FStringsIN;
Зачем создавать TStringList, чтобы тут же потерять на него ссылку?
FStringsIN:=New;
FStringsIN.Assign(New) своя копия надежнее будет
Dr.TurboBoa (2006-05-20 14:41:00) [8]Переместил, ничего не получилось. Все та же ошибка!
Сергей М. (2006-05-19 13:37:00) [9]
> при попытке редактирования из среды разработки property
> типа TStrings
Среда разработки (Object Inspector имеется ввиду ?) в дизайн-тайм редактирует лишь те св-ва, которые размещены в секции published компонента, а она у тебя пуста.
?
Dr.TurboBoa (2006-05-19 12:32:00) [10]Код исходника в выборочном варианте:
unit Coder;
interface
uses
SysUtils, Classes;
type
TCoder = class(TComponent)
private
{ Private declarations }
FStringsIN : TStrings;
FStringsOUT : TStrings;
//constructor Create;
//destructor Destroy;
function GetStringsIN : TStrings;
function GetStringsOUT : TStrings;
procedure SetStringsIN(New : TStrings);
protected
{ Protected declarations }
function StrsCoding(Input : TStrings) : TStrings;
function StrCoding(Input : String) : String;
function CharCoding(Input : char) : char;
public
{ Public declarations }
property StringsIN : TStrings read GetStringsIN
write SetStringsIN;
property StringsOUT : TStrings read GetStringsOUT;
procedure Execute; overload;
// function Execute: TStrings; overload;
function Execute(Input : TStrings): TStrings; overload;
published
{ Published declarations }
end;
const num=187;
var
TableIN : array[1..187] of char=( '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\', 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', '[', ']', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.', '/', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+', '|', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P', '{', '}', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', '"', 'Z', 'X', 'C', 'V', 'B', 'N', 'M', '', '?', '¸', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', '\', 'é', 'ö', 'ó', 'ê', 'å', 'í', 'ã', 'ø', 'ù', 'ç', 'õ', 'ú', 'ô', 'û', 'â', 'à', 'ï', 'ð', 'î', 'ë', 'ä', 'æ', 'ý', 'ÿ', '÷', 'ñ', 'ì', 'è', 'ò', 'ü', 'á', 'þ', '.', '¨', '!', '"', '¹', ';', '%', ':', '?', '*', '(', ')', '_', '+', '/', 'É', 'Ö', 'Ó', 'Ê', 'Å', 'Í', 'Ã', 'Ø', 'Ù', 'Ç', 'Õ', 'Ú', 'Ô', 'Û', 'Â', 'À', 'Ï', 'Ð', 'Î', 'Ë', 'Ä', 'Æ', 'Ý', 'ß', '×', 'Ñ', 'Ì', 'È', 'Ò', 'Ü', 'Á', 'Þ', ',' );
TableOUT : array[1..187] of char=( '1', 'q', 'a', 'z', '2', 'w', 's', 'x', '3', 'e', 'd', 'c', '4', 'r', 'f', 'v', '5', 't', 'g', 'b', '6', 'y', 'h', 'n', '7', 'u', 'j', 'm', '8', 'i', 'k', ',', '9', 'o', 'l', '.', '0', 'p', ';', '/', '-', '[', '=', ']', '\', '`', '!', 'Q', 'A', 'Z', '@', 'W', 'S', 'X', '#', 'E', 'D', 'C', '$', 'R', 'F', 'V', '%', 'T', 'G', 'B', '^', 'Y', 'H', 'N', '&', 'U', 'J', 'M', '*', 'I', 'K', '', ')', 'P', ':', '?', '_', '{', '"', '+', '}', '|', '~', '1', 'é', 'ô', 'ÿ', '2', 'ö', 'û', '÷', '3', 'ó', 'â', 'ñ', '4', 'ê', 'à', 'ì', '5', 'å', 'ï', 'è', '6', 'í', 'ð', 'ò', '7', 'ã', 'î', 'ü', '8', 'ø', 'ë', 'á', '9', 'ù', 'ä', 'þ', '0', 'ç', 'æ', '.', '-', 'õ', 'ý', '=', 'ú', '\', '¸', '!', 'É', 'Ô', 'ß', '"', 'Ö', 'Û', '×', '¹', 'Ó', 'Â', 'Ñ', ';', 'Ê', 'À', 'Ì', '%', 'Å', 'Ï', 'È', ':', 'Í', 'Ð', 'Ò', '?', 'Ã', 'Î', 'Ü', '*', 'Ø', 'Ë', 'Á', '(', 'Ù', 'Ä', 'Þ', ')', 'Ç', 'Æ', ',', '_', 'Õ', 'Ý', '+', 'Ú', '/', '¨' );
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Coding', [TCoder]);
end;
//constructor TCoder.Create;
//begin
//FStringsIN:=TStringList.Create;
//FStringsIN.Add('IN');
//FStringsOUT:=TStringList.Create;
//FStringsOUT.Add('OUT');
//end;
//destructor TCoder.Destroy;
//begin
//FStringsIN.Free;
//FStringsOUT.Free;
//end;
function TCoder.CharCoding(Input : char) : char;
begin
end;
function TCoder.StrCoding(Input : String) : String;
begin
end;
function TCoder.StrsCoding(Input : TStrings) : TStrings;
begin
end;
procedure TCoder.Execute;
begin
FStringsOUT:=StrsCoding(FStringsIN);
end;
function TCoder.Execute(Input : TStrings): TStrings;
begin
Result:=TStringList.Create;
Result:=StrsCoding(Input);
end;
function TCoder.GetStringsIN : TStrings;
begin
Result:=TStringList.Create;
Result:=FStringsIN;
end;
function TCoder.GetStringsOUT : TStrings;
begin
Result:=TStringList.Create;
Result:=FStringsOUT;
end;
procedure TCoder.SetStringsIN(New : TStrings);
begin
FStringsIN:=New;
end;
end.