Форум: "Основная";
Текущий архив: 2003.05.12;
Скачать: [xml.tar.bz2];
ВнизРедактор свойств Найти похожие ветки
← →
Елена (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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.016 c