Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.12;
Скачать: CL | DM;

Вниз

Редактор свойств   Найти похожие ветки 

 
Елена   (2003-04-17 00:13) [0]

Подскажите, пожалуйста.
Мне надо написать редактор свойств для TStrings, который все строки преобразует в строки, начинающиеся с заглавной буквы. Какой процедурой это можно сделать?
Какой модуль нужно включить в uses, чтобы можно было наследовать от TPropertyEditor?
Я так поняла, что нужно перегрузить TPropertyEditor.Edit и TPropertyEditor.GetAttributes, а еще что?
Как мне в Memo1 записать значение свойства компоненты, с помощью GetStrValue, или нет (для TStrings)?
procedure TMyStringListProperty.Edit;
var MyDlg: TMyDlg;
begin
MyDlg:=TMyDlg.Create(Application);
try
MyDlg.Memo1.Text:=GetStrValue;
if MyDlg.ShowModal=MyDlg.OKBtn.ModalResult
then
SetStrValue(MyDlg.Memo1.Text)
finally
MyDlg.Free;
end;
end;
Как мне вообще запустить редактор выполняться, чтобы его установить?


 
Babay ©   (2003-04-17 06:22) [1]

Что то я несовсем понял...
Вы пишите компонет содержащий свойство типа TStrings и Вам нужен для него свой редактор?
Тогда лучше почитать что-нить на эту тему и Вам станет все понятно.
Если Вам нужно только переделывать буквы на большие в начале строки, то для своего компонета можно сделать это в процедуре установки свойства вашего компонета например SetMyProperty. И использовать стандартный редактор Delphi. Я например так делал когда мне надо было, что бы в свойстве были все буквы только большие.
Насчет замены букв по Вашей задаче. Такой фукции в дельфе нет.
Нужно писать свою (хотя может кто-то такое писал и есть уже готовое решение, только вот найти его ...??.. я написал бы свою)


 
Юрий Зотов ©   (2003-04-17 09:12) [2]

property MyStringList: TStrings
read FMyStringList write SetMyStringList;

procedure SetMyStringList(const Value: TStrings);
var
i: integer;
begin
FMyStringList.Assign(Value);
for i := 0 to FMyStringList.Count - 1 do
if FMyStringList[i] <> "" then
FMyStringList[i][1] := AnsiUpperCase(FMyStringList[i][1])
end;

И не нужны никакие редакторы.


 
Babay ©   (2003-04-17 09:30) [3]

To Юрий
всегда с наслаждением читаю Ваши ответы, кратко, лаконично, ясно.
Вообщето я о отом же и говорил.


 
Елена   (2003-04-19 18:08) [4]

Товарищи, вы не поняли. Мне именно редактор свойств нужен, именно в диалоговом окне. Мне курсовик написать надо. Задание - компонента TStringGrid с ее свойством Captions:TStrings, содержащим заголовки столбцов. А также редактор этого свойства и редактор компоненты. Компоненту с новым свойством я уже написала. Проблема теперь в редакторе свойств.


 
Юрий Зотов ©   (2003-04-19 18:45) [5]

type
TMyStringListProperty = class(TPropertyEditor)
function AllEqual: Boolean; override;
function GetAttributes: TPropertyAttributes; override;
procedure Edit; override;
end;

function TMyStringListProperty.AllEqual: Boolean;
var
i: integer;
S: string;
begin
Result := True;
S := TMyCompoment(GetComponent(0)).MyProperty.Text;
for i := 1 to PropCount - 1 do
if TMyCompoment(GetComponent(i)).MyProperty.Text <> S then
begin
Result := False;
Break
end
end;

function TMyStringListProperty.GetAttributes: TPropertyAttributes;
begin
Result := [paMultiSelect, paDialog, paReadOnly]
end;

procedure TMyStringListProperty.Edit;
var
i: integer;
begin
with TMyDlg.Create(Application) do
try
Memo1.Text := TMyCompoment(GetComponent(0)).MyProperty.Text;
if ShowModal = mrOK then
begin
for i := 0 to PropCount - 1 do
TMyCompoment(GetComponent(i)).MyProperty.Text := Memo1.Text;
Designer.Modified
end
finally
Free
end
end;


 
Елена   (2003-04-20 19:02) [6]

Что-то я не поняла, для чего нужна AllEqual, почему paReadOnly, и что такое TMyComponent(GetComponent(0)).MyProperty.Text, и почему не нужны функции GetStrValue и SetStrValue.


 
Юрий Зотов ©   (2003-04-21 06:34) [7]

AllEqual, paReadOnly и GetComponent - класс TPropertyEditor снабжен довольно подробными комментариями.

TMyComponent - класс Вашего компонента, а MyProperty - имя Вашего свойства в нем.

Почему не нужны функции GetStrValue и SetStrValue - Ваше свойство объектное, а не строковое.


 
Елена   (2003-04-21 17:36) [8]

Я очень извиняюсь за глупый вопрос, но в Help нет ничего про AllEqual и GetComponent, для чего они нужны? И еще, у меня все компилируется без ошибок, а редактор не регистрируется. Не знаете почему?
procedure Register;
begin
RegisterPropertyEditor(TypeInfo(TStrings), TMyStringGrid, "Captions", TMyStringListProperty);
end;


 
Skier ©   (2003-04-21 17:47) [9]


> но в Help нет ничего про AllEqual и GetComponent, для чего
> они нужны?

Нужно смотреть не Help, а файл DesignIntf.pas

> И еще, у меня все компилируется без ошибок, а редактор не
> регистрируется. Не знаете почему?

А у Вас св-во Captions точно типа TStrings ?
(и вообще проверьте всё ли в строке регистрации свойства правильно, т.е. все ли типы правильно расставлены...:) )
Вообще так трудно уже сказать в чём ошибка (вроде Маэстро Вам всё
рассказал...)
Если не получиться - придёться показать целиком весь код...


 
Елена   (2003-04-27 16:05) [10]

Подскажите, пожалуйста, почему в DesignTime свойство Captions(заполняет заголовки столбцов) работает, а в RunTime нет?
type
TMyStringGrid = class(TStringGrid)
private
{ Private declarations }
fCaptions:TStrings;
procedure SetCaptions(Value:TStrings);
function GetColCount: Longint;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(Owner:TComponent); override;
destructor Destroy; override;
published
{ Published declarations }
property ColCount: Longint
read GetColCount;
property Captions:TStrings
read fCaptions
write SetCaptions;
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents("Samples", [TMyStringGrid]);
end;

constructor TMyStringGrid.Create(Owner:TComponent);
begin
inherited Create(Owner);
fCaptions:=TStringList.Create;
end;

destructor TMyStringGrid.Destroy;
begin
fCaptions.free;
inherited Destroy;
end;


procedure TMyStringGrid.SetCaptions(Value:TStrings);
begin
fCaptions.Assign(Value);
inherited ColCount:=fCaptions.Count;
Rows[0].Assign(fCaptions);
end;

function TMyStringGrid.GetColCount: Longint;
begin
Result:= fCaptions.Count;
end;
end.


 
Юрий Зотов ©   (2003-04-27 18:54) [11]

Попробуйте так:

procedure TMyStringGrid.SetCaptions(Value:TStrings);
begin
fCaptions.Assign(Value);
inherited ColCount:=fCaptions.Count;
Rows[0].Assign(fCaptions);
Invalidate // или Refresh, но лучше Invalidate
end;



 
Елена   (2003-04-27 21:35) [12]

Не получилось, ни так, ни так. Может в конструкторе что нибудь написать? В Help есть пример про
FBrush.OnChange := BrushChanged;
в конструкторе, но у fCaptions нет OnChange. Что делать?


 
Skier ©   (2003-04-29 15:32) [13]

>Елена

> , но у fCaptions нет OnChange. Что делать?

1)У fCaptions "будет" OnChange если его закастить на
TStringList. ,т.е. TStringList(fCaptions).OnChange := ???
правда сие не очень красиво, но попробовать можно, если, конечно
это будет для тебя выходом
2)у TStringGrid-а есть ещё метод IvalidateRow(...) Может
поможет...



Страницы: 1 вся ветка

Текущий архив: 2003.05.12;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
4-34643
Andy BitOff
2003-03-09 20:19
2003.05.12
Имя ехе шника


14-34604
Serghei
2003-04-24 14:08
2003.05.12
СОХРАНЕНИЕ параметров программы


1-34422
saty
2003-04-28 16:08
2003.05.12
файл с записями


14-34571
default
2003-04-22 15:15
2003.05.12
Численные методы


14-34568
Askik
2003-04-23 15:45
2003.05.12
А кто знает, что за файл такой pagefile.sys ?