Форум: "Основная";
Текущий архив: 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]День добрый, Сатир,
Успехов!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.007 c