Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: Frodo_Torbins
Дата сообщения: 29.12.2009 17:19
90Kinoman
Вы топиком ошиблись. Вам сюда: http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=2395#1
JohnSilver182
Думаю вам в сторону RTTI стоит глянуть.
Автор: ppkp
Дата сообщения: 29.12.2009 20:03
Необходимо вводить данные разных типов. Для этого создаю классы для каждого типа
TClass1 = class(TBaseClass)
public
StringVar: string;
property PropCount;
end;

TClass2 = class(TBaseClass)
public
DateTimeVar: TDateTime;
IntegerVar: integer;
property PropCount;
end;
.............
и т.д. Не знаю, как вызвать соответствующий класс, т.к. не знаю какого типа должна быть X
var X: T?????

case dataType of
dt1: X := TClass1.Create;
dt2: X := TClass2.Create;
end;
Caption := X.IntegerVar - ее не видно в X

Пробовал объявлять X типа pointer, TClass, TObject - ничего не получается.
Какого типа должна быть X ?
Автор: NOwlar
Дата сообщения: 29.12.2009 20:09
ppkp

TBaseClass

Вообще, и с TObject должно было срабоать, а чтобы обратиться к IntegerVar напиши
Caption := (X as TClass2).IntegerVar
Автор: ppkp
Дата сообщения: 29.12.2009 20:20
NOwlar
TBaseClass = class
private
FBlockType: TBlockType;
protected
function GetPropCount: integer;
public
GeoClass: TObject;//TClass;???????????????
constructor Create(ABlockType: TBlockType);
destructor Destroy; override;
property BlockType: TBlockType read FBlockType;
property PropCount: integer read GetPropCount;
end;

Цитата:
Caption := (X as TClass2).IntegerVar

1.Но я не знаю что писать после as TClass1 или TClass2
2. TBaseClass не содержит IntegerVar
Автор: data man
Дата сообщения: 29.12.2009 20:35
ppkp
Читай статьи про инспекторы объектов, например:
Flexible Frame - механизм добавления к объекту произвольных характеристик без использования наследования
Инспектор объектов и метаданные
Автор: ppkp
Дата сообщения: 29.12.2009 20:38
Попробовал
var
AClass: TBaseClass;//TObject;//TClass;

case bt of
bt1: begin
X := TClass1.Create(bt1);
AClass := X as TClass1;
end;

bt2: begin
X := TClass2.Create(bt2);
AClass := X as TClass2;
end;
end;

AClass.StringVar - не видит


Добавлено:
data man
Предыдущее добавил до Вашего поста.
Автор: Frodo_Torbins
Дата сообщения: 29.12.2009 21:29
ppkp
А тип Variant вам не подойдет?
Автор: ppkp
Дата сообщения: 29.12.2009 22:04
Frodo_Torbins
Нет, не проходит. Попробовал так

case bt of
bt1: X := TClass1.Create(bt1);
bt2: X := TClass2.Create(bt2);
end;

case X.BlockType of
bt1: Caption := (X as TClass1).StringVar;
bt2: Caption := FormatDateTime('dd.mm.yy', (X as TClass2).DateTimeVar);
end;

и, естественно, заработало. Но это не совсем то, чего хотелось бы - универсальности. Наверное, действительно нужно хорошо изучить TypInfo.pas
Автор: data man
Дата сообщения: 29.12.2009 22:18
ppkp

Цитата:
Но это не совсем то, чего хотелось бы - универсальности.

Вот ! Я поэтому и привел ссылки на инспекторы, так как следующий шаг - удобное редактирование свойств объектов, верно ?
В D2010 этим и удобны аттрибуты - гибкостью. И уже куча материала по работе с ними есть.
Если интересно - закидаю ссылками.
Автор: ppkp
Дата сообщения: 29.12.2009 22:29
data man
Да, да!! Попробовал

Цитата:
Инспектор объектов и метаданные
Там, правда нет поддержки Unicode (я сейчас в D2010), но переделал, запустил и изучаю его. За ссылки заранее огромное спасибо - сколько сможете.
Автор: data man
Дата сообщения: 29.12.2009 22:51
ppkp

Ответил здесь
Автор: ppkp
Дата сообщения: 29.12.2009 23:04
data man
Спасибо большое
Автор: JohnSilver182
Дата сообщения: 30.12.2009 06:54

Цитата:
JohnSilver182
Думаю вам в сторону RTTI стоит глянуть.


Ничего не понимаю, мне пишут что надо смотреть то Интерфейсы то на RTTI
Вот не могу поверить что не у кого нет готового решения для создания динамически форм и передача им параметров .
Автор: greenpc
Дата сообщения: 30.12.2009 07:08
ppkp

Цитата:
Но я не знаю что писать после as TClass1 или TClass2

if (X is TClass1) then Caption := TClass1(X).IntegerVar
ну и вот так

Код: type
TAccount = class
private
fCustomer: string;
fNumber: Cardinal;
fBalance: Currency;
end;
TSavingsAccount = class(TAccount)
private
fInterestRate: Integer;
end;
TCheckingAccount = class(TAccount)
private
fReturnChecks: Boolean;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
var
c1 : TAccount;
begin
с1 :=nil;
c1 := TSavingsAccount.Create;
try
// if assigned(c1) then -- если нужно проверить что существует
if (c1 is TSavingsAccount) then begin
TSavingsAccount(c1).fInterestRate := 3523;
ShowMessage(IntToStr(TSavingsAccount(c1).fInterestRate));
end;
finally
FreeAndNil(c1);
end; // try/finally
end;
Автор: victorman2010
Дата сообщения: 30.12.2009 08:50
В компонент ClientDataSet загружаю xml файл, пишет Mismatch in datapacket. Неправильная структура xml-файла. ClientDataSet понимает только свою структуру. А если скачать другие компоненты для работы с xml? Подскажите пож какие компоненты и от куда. Суть проблемы: есть xml файл нужно отобразить его в DB Grid, отредактировать и записать обратно в файл. Заранее благодарен.
Автор: data man
Дата сообщения: 30.12.2009 09:06
victorman2010
Попробуй OmniXML
Там в файле OmniXMLDatabase.pas есть процедура XMLFileToDataset.
Только в датасете должны быть поля с соответствующими именами.
Автор: victorman2010
Дата сообщения: 30.12.2009 10:09
data man
Спс, только я слаб в программировании, все равно ничего не понимаю: как эту процедуру подключить и настроить?
Автор: ppkp
Дата сообщения: 30.12.2009 10:30
greenpc
После try, в принципе, то же самое, что и было в постах. А перед try
Цитата:
c1 := TSavingsAccount.Create
те же грабли - неизвестно что будет справа:либо писать case
Автор: volser
Дата сообщения: 30.12.2009 10:33
JohnSilver182
Написали же. Нужно использовать интерфейсы. RTTI тут немного не к месту. Или же можно создать общего предка в котором реализована передача параметров.
Автор: data man
Дата сообщения: 30.12.2009 10:37
victorman2010
Цитата:
только я слаб в программировании

А чего же тогда сразу за XML-то ?

Код: interface
uses
..., OmniXMLDatabase;

begin
XMLFileToDataset('data.xml', MyDataSet, '', [odbIgnoreUnsupportedColumns, odbIgnoreMissingColumns]);
end;
Автор: greenpc
Дата сообщения: 30.12.2009 11:44
ppkp
ну и чем не устраевает или я что то не понимаю ?

Код:
case dataType of
dt1: c1 := TSavingsAccount.Create;
dt2: c1 := TCheckingAccount.Create;
else c1 :=nil;
end;
if assigned(c1) then begin
if (c1 is TSavingsAccount) then begin // with (c1 as TSavingsAccount) do ...
...
end else
if (c1 is TCheckingAccount) then begin
...
end;
Автор: ppkp
Дата сообщения: 30.12.2009 13:41
greenpc

Цитата:
ну и чем не устраевает или я что то не понимаю

Все правильно и работает. Только не универсально. Если классов много, Case получится ну очень длинный. Отсюда следует, что вместо

Цитата:
if (c1 is TSavingsAccount) then begin // with (c1 as TSavingsAccount) do

Var1:=1; Var2 :='aaa'; Var3 := False;
код типа
with c1 do for I:=0 to PropCout-1 do Prop[I] :=Val(I);
смотрится изящнее. И потом, вызванный класс может передаваться в качестве параметра в Инспектор Объектов, например, а в Вашем варианте это невозможно(затруднительно).
ЗЫ
Цитата:
Но главное в начале узнать точно что за предмет
Это действмтельно главное. Но узнать класс можно не только перебором, а из поля ClassInfo в PropList
Автор: mdid
Дата сообщения: 02.01.2010 00:52
поздскажите плз..как отследить изменения иконок на рабочем столе..интересует появление/удаление?тоесть какое событие за это отвечает
ПС
еси кто вкурсе может где то есть описание всех событий в какой то последовательности?
Автор: ShIvADeSt
Дата сообщения: 02.01.2010 01:08
mdid
Иконки на рабочем столе - это элементы ListView (если память не изменяет). Для отслеживания появления надо как минимум делать перехват оконной процедуры проводника, и там отслеживать события для листвью. Из своей программы это не получится делать, так как надо внедрять библиотеку в адресное пространство проводника (иначе нормальный перехват не сделать насколько я знаю). Так как это не типовой вопрос - то предлагаю оформить отдельной темой. Правда не знаю, насколько это актуально - для внедрения процедуры надо иметь права админа, да и чревато это.
Автор: regkz
Дата сообщения: 02.01.2010 04:54
mdid
можешь посмотреть на торри.нет раздел Components > Files and Drives > Notification, я для похожих целей использовал ATFileNotification когда-то
Автор: mdid
Дата сообщения: 03.01.2010 16:16
угу..пасиб..ща поколупаю
правда с таким же успехом можно поставить таймер на папку рабочего стола и отслеживать изменения
Автор: regkz
Дата сообщения: 04.01.2010 18:42

Цитата:
можно поставить таймер на папку рабочего стола и отслеживать изменения

можно, но нужно ли изобретать велосипед? компонент с исходными кодами, чего не хватает - можно дописать
Автор: ShIvADeSt
Дата сообщения: 05.01.2010 08:51
mdid

Цитата:
правда с таким же успехом можно поставить таймер на папку рабочего стола и отслеживать изменения

Так тебе иконки или все таки папки/файлы в директории рабочего стола? Это немного разные вещи.
Автор: murkovich
Дата сообщения: 05.01.2010 11:26
ShIvADeSt

Цитата:
Это немного разные вещи.

Ради интереса - а в чём оно такое разное? Ясно, что расположение иконок так не отследишь, но всё остальное ведь да? Плюс, разумеется, надо не на одну папку смотреть, а сливать вместе личную и публичную папки десктопа.
Автор: victorman2010
Дата сообщения: 05.01.2010 12:51
В компонент ClientDataSet загружаю xml файл (через утилиту xmlMapper создаю трансформационные файлы для импорта и экспорта) через xmlTransform:

XMLTransform1.SourceXmlFile := 'D:\OX.xml';
XMLTransform1.TransformationFile := 'D:\OXtrans.xtr';
ClientDataSet1.XMLData := XMLTransform1.data;

отображаю в гриде, редактирую, подскажите пож как записать обратно в файл, так НЕ получается:

XMLTransform1.SourceXml := ClientDataSet1.XMLData ;
XMLTransform1.TransformationFile := 'D:\toxml.xtr';
XMLTransform1.SourceXmlFile := 'D:\OX.005.xml';

или так:

XMLTransformProvider1.XMLDataFile := 'D:\O.005.xml';
XMLTransformProvider1.TransformWrite.TransformationFile := 'D:\toxml.xtr';
XMLTransformProvider1.DataRequest(ClientDataSet1.data);

заранее благодарен.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.