Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как работать с 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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо