Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
14-34574
Mike B.
2003-04-18 12:14
2003.05.12
Бэст


14-34548
Aristarh
2003-04-23 00:04
2003.05.12
Кто читал


14-34592
Soft
2003-04-21 18:05
2003.05.12
Партия программистов


14-34566
Scorpx
2003-04-17 19:31
2003.05.12
Обновление сайта!!!


8-34519
SN
2003-01-30 00:59
2003.05.12
DS PACK





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский