Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
3-80814
Бульбаш
2002-04-05 13:15
2002.04.25
Блокировки в ODAC


6-81012
Татьяна
2002-02-07 08:01
2002.04.25
Как соединть сервер, программированный на D4 с клиентом под DOS по IPX


3-80738
Olex
2002-04-05 21:36
2002.04.25
Как убрать запрос логина и пароля при обращении к БД Аксес...


4-81104
Romul
2002-02-18 12:29
2002.04.25
Как воостановить подключение к сетевому диску?


1-80958
Explorer
2002-04-12 10:28
2002.04.25
Возможно запретить табуляцию?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский