Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

Ошибка при создании редакторя свойств 


Сатир   (2002-04-10 15:04) [0]

Значить зарегестрировал я свой ведактор свойств как
RegisterPropertyEditor(TypeInfo(String), TControl, "Source", TSourceProperty);
И после этого в инспекторе объектов появилось свойство Source с деактивированым значением (TStrings) и кнопочкой "...". Но после нажатия на кнопку выдает сообщение:
Cannot assign a nil to a TRichEditStrings
Кто знает, в чем ошибка?



Игорь Шевченко   (2002-04-10 15:16) [1]

День добрый,

Очевидно, ошибка в 17-ой строке.

И все-таки String или TStrings ?

С уважением,



Сатир   (2002-04-10 15:24) [2]

В книжке написано String, но после замены на TStrings ничего не изменилось.



Игорь Шевченко   (2002-04-10 17:19) [3]

День добрый,

А то, что в книжке написано - работает?
Что за книжка ?

А в Delphi/Source/Property Editors/*.pas посмотреть ? :-)

С уважением, Игорь Шевченко



Сатир   (2002-04-10 18:02) [4]

Книжка называется COM и ActiveX в Delphi, автор В.Пономарев
/Source/Property Editors/*.pas смотрел. Даже взал оттуда StrEdit и StringsEdit для вызова формы ввода строк при редактировании свойства, но всё зря. Не фунциклирует и всё!



Игорь Шевченко   (2002-04-10 18:08) [5]

День добрый, Сатир,

Полный код в студию, плз

С уважением, Игорь Шевченко



Mystic   (2002-04-10 18:12) [6]

Если проходить пошагово, то в какой строке ошибка?



Сатир   (2002-04-10 18:26) [7]

unit XGroupBar;

interface

uses
Windows, Messages, SysUtils, Classes, Controls,
dcOutBar,//модуль, от которого порождается потомок
//это может быть любой класс
StdCtrls, DesignIntf,DesignWindows, ComCtrls, DesignEditors;

type

type
TXGroupBar = class(TCustomDCGroupBar)//dream company component
private
{ Private declarations }
// FSource:TString;
// procedure SetSource(Value: TStrings);
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
// property Source:TString read FSource write FSource;
end;

// Этот класс взят из Source/Property Editors/StringsEdit.pas
TStringsEditDlg = class(TStrEditDlg)
LineCount: TLabel;
Bevel1: TBevel;
Memo: TRichEdit;
procedure Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure UpdateStatus(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
SingleLine: string;
MultipleLines: string;
protected
function GetLines: TStrings; override;
procedure SetLines(const Value: TStrings); override;
function GetLinesControl: TWinControl; override;
public
{ Public declarations }
end;

//Объявление класса редактора свойств
TSourceProperty = class(TStringProperty)
public
procedure Edit; override;
function GetAttributes: TPropertyAttributes; override;
function GetValue: string; override;
end;


procedure Register;

implementation

uses DesignConst;// это требует StringsEdit

function TSourceProperty.GetValue: string;
var i:byte;
begin
Result:=inherited GetValue;
for i:=1 to Byte(Result[0]) do
if result[i]<#32 then result[i]:=">";
end;
function TSourceProperty.GetAttributes:TPropertyAttributes;
begin
Result:= inherited GetAttributes + [paDialog];
end;

procedure TSourceProperty.Edit;
var StringsEditDlg:TStringsEditDlg;
s:string;
begin
StringsEditDlg:=TStringsEditDlg.Create(Application);
with StringsEditDlg do
try
Memo.MaxLength:=254;
s:=GetStrValue + #0;
Memo.Lines.SetText(@s[1]);
UpdateStatus(nil);
if ShowModal = mrOk then begin
s:=StrPas(Memo.Lines.GetText);
if s[0]>#2 then Dec(Byte(s[0]),2);
SetStrValue(s);
//FSource:=Memo.Lines.GetText; - это была попытка присвоить значение мемо нашему полю
end;
finally
free;
end;
end;

// это всё взято из /source/property editors/stringseditor.pas
function TStringsEditDlg.GetLinesControl: TWinControl;
begin
Result := Memo;
end;

procedure TStringsEditDlg.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_ESCAPE then CancelButton.Click;
end;

procedure TStringsEditDlg.UpdateStatus(Sender: TObject);
var
Count: Integer;
LineText: string;
begin
if Sender = Memo then FModified := True;
Count := Memo.Lines.Count;
if Count = 1 then LineText := SingleLine
else LineText := MultipleLines;
LineCount.Caption := Format("%d %s", [Count, LineText]);
end;

procedure TStringsEditDlg.FormCreate(Sender: TObject);
begin
inherited;
SingleLine := srLine;
MultipleLines := srLines;
end;

function TStringsEditDlg.GetLines: TStrings;
begin
Result := Memo.Lines;
end;

procedure TStringsEditDlg.SetLines(const Value: TStrings);
begin
Memo.Lines.Assign(Value);
end;
procedure Register;
begin
RegisterComponents("Samples",[TXGroupBar]);
RegisterPropertyEditor(TypeInfo(TStrings), TControl, "Source", TSourceProperty);
end;

end.



Mystic   (2002-04-10 18:53) [8]

Установи активным свой design-time package
Host application = delphi32.exe
Run (F9)
Попытайся отладить



Игорь Шевченко   (2002-04-11 10:39) [9]

День добрый,

При работе с длинными строками нельзя ссылаться на длину строки, по s[0] и на данные по @s[1].

>>Memo.Lines.SetText(@s[1]);

Или где-то явно указано, что строки короткие ? Из текста не видно...

С уважением, Игорь Шевченко



Сатир   (2002-04-11 12:22) [10]

Игорь Шевченко>
Memo.MaxLength:=254; а разве это не указывает на длину строки?



Игорь Шевченко   (2002-04-11 12:39) [11]

День добрый,

Не надо путать тип ShortString, где длина хранилась в 0-м символе и текст начинался с s[1] и AnsiString, который организован совершенно по-другому. Тип string по умолчанию и есть AnsiString. Memo работает именно с этим типом, редакторы свойств тоже.
Вместо s[0] надо использовать Length(S) при чтении и SetLength при изменении. И так далее, в help"е достаточно подробно написано.

С уважением, Игорь Шевченко



Сатир   (2002-04-11 15:13) [12]

Игорь Шевченко>
Спасибо за совет. Я переписал заново свое свойство и все получилось. Может из-за того что когда я описывал свойство я не задавал write, то есть


TXDCGroupBar = class(TCustomDCGroupBar)
private
{ Private declarations }
FSource:TStrings;// данное свойство
protected
{ Protected declarations }
public
{ Public declarations }
destructor Destroy; override;
published
{ Published declarations }
property Source:TStrings read FSource; // отсутствует write
end;
...
procedure Register;
begin
RegisterComponents("Samples", [TXDCGroupBar]);
RegisterPropertyEditor(TypeInfo(TStrings), TControl, "Source", TSourceProperty);// зарегестрированый редактор свойств, который привязывается к свойству "Source"
end;


Вопрос следующий: когда я каждый раз обращаюсь к этому свойству, редактор каждый раз создает свое окно заново и если я перед этим загрузил файл в него, то при последующем обращении к этому свойству этот файл исчезает (это понятно, поскольку я освобождаю объект, в который загружается этот файл). Подскажите, как присвоить этому свойству имя файла, который был последним загружен, и загружать его при каждом обращении к этому свойству?



Игорь Шевченко   (2002-04-11 15:22) [13]

День добрый,

Другой редактор написать. Свойство FSource сделать не Tstrings, а хранящим одновременно и Strings и имя последнего файла. Хотя, не совсем понимаю, зачем - ведь в стандартном редакторе TStrings есть переход в Code Editor, куда можно вставлять содержимое файла... Или я что-то не так понимаю? :-)

С уважением,



Сатир   (2002-04-11 16:02) [14]

Игорь Шевченко>
Так дело в том, что мне в этом редакторе нежно проводить парсинг XML-файла, поэтому я его переписал заново. Этот редактор содержит ещё два компонента для парсинга.
А вы не могли бы привести хотя бы примерный кусок кода для хранения инени файла и самого редактора?



Игорь Шевченко   (2002-04-11 16:06) [15]

День добрый, Сатир,

С ходу - вряд ли...

С уважением,



Сатир   (2002-04-11 16:45) [16]

Игорь Шевченко>
Ну я могу подождать, поэксперементирую пока сам



Игорь Шевченко   (2002-04-11 16:47) [17]

День добрый, Сатир,

Успехов!




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.76 MB
Время: 0.022 c
1-81009           Demon Ltd             2002-04-13 00:05  2002.04.25  
Работа повторно с меню


1-80906           sergr                 2002-04-11 12:58  2002.04.25  
Как сделать форму нестандартных размеров?


1-80859           Stasya                2002-04-13 15:13  2002.04.25  
Запуск


3-80810           MaXie                 2002-04-05 12:20  2002.04.25  
Как связать DBGrid с кириллицей?


1-80845           konusov               2002-04-13 00:37  2002.04.25  
Как изменить дату создания файла?