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

Вниз

Разработка конвертора VCL to KOL   Найти похожие ветки 

 
BaryVetaL ©   (2005-12-22 15:36) [0]

Начал разработку как и обещал...
Сейчас делаю модуль VCLtoKOL который содержит переопределение процедур из VCL в KOL (например int2str в IntToStr), а так же неторые классы, константы и типы, которые не содержаться в модуле KOL.

У кого есть какие нибудь идеи по разработке прошу ... не стесняйтесь :-)


 
RA ©   (2005-12-22 17:58) [1]

Правильнее будет не добавлять модуль с переопределением процедур, а изменить названия на коловские в самом партируемом модуле. А иначе что же это за оптимизация получается, когда добавляем никому не нужные объявления?


 
Vedun   (2005-12-22 22:40) [2]


> Сейчас делаю модуль VCLtoKOL который содержит переопределение
> процедур из VCL в KOL (например int2str в IntToStr), а так
> же неторые классы, константы и типы, которые не содержаться
> в модуле KOL.


А я так понял, что этот модуль как раз и

> изменяет названия на коловские в самом партируемом модуле.


 
RA ©   (2005-12-23 09:23) [3]

А я понял, что
// делаю модуль VCLtoKOL который содержит переопределение процедур из VCL в KOL (например int2str в IntToStr)
Т.е. то о чем писал Thaddy:
type TInt2Str = function ( Value : Integer ) : String;
const IntToStr:TInt2Str = Int2Str;


 
BaryVetaL ©   (2005-12-23 09:29) [4]

Показываю, как и советовал Theddy:

//----------------------------------------------
//              Типы переопределения
//----------------------------------------------
type
 TMakerect = function ( Left, Top, Right, Bottom: Integer ): TRect; stdcall;
 TMakePoint = function ( X, Y: Integer ): TPoint;
 TInt2Str = function ( Value : Integer ) : String;
 TInt2Hex = function ( Value : DWord; Digits : Integer ) : String;
 TStr2Int = function (const Value : String) : Integer;
 TDouble2Str = function ( D: Double ): String;
 TStr2Double = function ( const S: String ): Double;
 TDateTime2StrShort = function ( D: TDateTime ): String;
 TStr2DateTimeShort = function ( const S: String ): TDateTime;

 TNewOpenDialog = function ( const Title, StrtDir: String; Options: TOpenSaveOptions ): POpenSaveDialog;
 TNewSaveDialog = function ( const Title, StrtDir: String; Options: TOpenSaveOptions ): POpenSaveDialog;
 TNewRadioButton = function ( AParent: PControl; const Caption: String ): PControl;
 TNewStringList = function : PStrList;

//----------------------------------------------
//          Константы переопределения
//----------------------------------------------
const
 Rect: TMakeRect = Makerect;
 Point: TMakePoint = MakePoint;
 IntToStr: TInt2Str = Int2Str;
 IntToHex: TInt2Hex = Int2Hex;
 StrToInt: TStr2Int = Str2Int;
 FloatToStr: TDouble2Str = Double2Str;
 StrToFloat: TStr2Double = Str2Double;
 DateTimeToStr: TDateTime2StrShort = DateTime2StrShort;
 StrToDateTime: TStr2DateTimeShort = Str2DateTimeShort;

 NewOpenDialog: TNewOpenDialog = NewOpenSaveDialog;
 NewSaveDialog: TNewSaveDialog = NewOpenSaveDialog;
 NewRadioButton: TNewRadioButton = NewRadiobox;
 NewStringList: TNewStringList = NewStrList;
 NewStrings: TNewStringList = NewStrList;

Да и вот еще: почему в KOL не добавлены следующие процедуры:
 function FindFirst(const Path: string; Attr: Integer; var  F: TSearchRec): Integer;
 function FindNext(var F: TSearchRec): Integer;
 procedure FindClose(var F: TSearchRec);
 function FileSetAttr(const FileName: string; Attr: Integer): Integer;
 function FileGetDate(Handle: Integer): Integer;
Ими все часто пользуются (покрайней мере я). Может есть какие-нибудь аналоги просто я не знаю как они называются?
Кто знает аналоги VCL в KOL? (ну один человек точно знает - Vladimir Kladov :-) )


 
RA ©   (2005-12-23 09:43) [5]

2BaryVetaL Зачем все эти переопределния? Не считаете ли вы, что гораздо проще (и логичнее) было бы делать замены прямо в модуле партируемой проги?


 
RA ©   (2005-12-23 09:43) [6]

2BaryVetaL Зачем все эти переопределния? Не считаете ли вы, что гораздо проще (и логичнее) было бы делать замены прямо в модуле партируемой проги?


 
BaryVetaL ©   (2005-12-23 09:57) [7]

Нет, я так не считаю. Лучше выписать все переопределения в отдельный файл и потом не мучаться и тратить дополнительное время на поиск и замену всех функций и процедур, которые нужно заменить, ведь ровным счетом, они ничего не занимают! Достаточно потом подключить один модуль VCLtoKOL+ модуль KOL и все будет работать!


 
Barloggg   (2005-12-23 11:14) [8]

ну хорошо, а как тогда быть с функциями вложенных объектов?
скажем как перекрыть ImageMouseMove синтаксис которых не совпадает с VCL форматом?
хотя впрочем да, подключить отдельный модуль симпатичнее и нагляднее.

почему-же, добавлены. нет не так. они действительно не добавлены ибо они есть в базовом WinApi и нафига их переписывать еще разок?
ВО! цитирую из уроки KOL

> Традиционно пользуются 3-мя API функциями: FindFirstFile
> (ищет первый файл из списка файлов), FindNextFile (ищет
> следующий файл) , FindClose (прекращение поиска). Обычно
> первые 2-е функции заменются их VCL-суррогатами FindFirst,
>  FindNext.

Короче читай здесь http://www.kolnmck.ru/lessonsind.htm
а точнее здесь http://www.kolnmck.ru/lessons%2012.htm


 
BaryVetaL ©   (2005-12-23 11:53) [9]

Если потом столкнусь с какими-то функциями вложенных объектов, то есть нельзя будет переопределить, то заменю...


> почему-же, добавлены. нет не так. они действительно не добавлены
> ибо они есть в базовом WinApi и нафига их переписывать еще
> разок?


Это нужно для совместимости с VCL, FindFirstFile по описанию отличается от FindFirst. Я выдрал из модуля SysUtils пару функций и поместил их в модуль VCLtoKOL, из за 5 функции и пары констант ничего страшного не будет, так как они не увеличат размер...


 
Barloggg   (2005-12-23 12:52) [10]

хорошо, надеюсь сам модуль SysUtls ты не подключаешь? это стоит порядочно.

Кстати вопрос, а есть ли в KOL  Str2Float?


 
MTsv DN ©   (2005-12-23 13:00) [11]

Str2Float -> Str2Double

С Уважением MTsv DN


 
BaryVetaL ©   (2005-12-23 13:47) [12]

Str2Float нет MTsv DN написал что есть у меня же выше написано:
TStr2Double = function ( const S: String ): Double;
...
StrToFloat: TStr2Double = Str2Double;
...

И еще в KOL есть и Extended2Str, а Str2Extended почему-то нет...

Barloggg о чем ты говоришь! Конечно же не подключаю! Он прибавляет что то типа 35 Kb.


 
BaryVetaL ©   (2005-12-23 14:21) [13]

Да и еще в KOL если создаю Memo, а потом использую в VCL:
...
Memo1.LoadFromFile(FileName);
...
че единственный выход:

var
 tmp: PStrList;
...
tmp := NewStrList;
tmp.LoadFromFile(FileName);
Memo1.Text := tmp.Text;
tmp.Free;
...

Можно ли одной строчкой в мемо загрузить, без создания tmp?


 
Vedun   (2005-12-23 15:07) [14]

А замену для StringGrid придумал? Я предлагаю  mdvXLGrid 1.03 (http://www.kolnmck.ru/files/kompon/mdvXLGrid.zip). Довольно симпатичная сетка с большим набором опций.


 
mdw ©   (2005-12-23 15:44) [15]

>А замену для StringGrid придумал? Я предлагаю  mdvXLGrid 1.03
mdvXLGrid 1.16 http://mdvkol.narod.ru/KOLmdvXLGrid.zip

Была еще StGrd, аналог VCl Grid"a, но ее нужно до ума доводить.


 
Thaddy   (2005-12-24 10:39) [16]

2 Barry:

Memo.text:=StrLoadFromFile(Filename);

;)


 
Vedun   (2005-12-25 01:05) [17]

А вот замена для VCL компонента TChart:  http://kolibdb.100free.com/files/KOLChart.zip . Автор - Thaddy. Зеркало добавил ECM.


 
BaryVetaL ©   (2005-12-26 09:37) [18]

Ну че, первая версия почти готова! Скоро выложу посмотреть. Хотя, сейчас смотрю на свой код, страшно посмотреть, ничего потом буду смотреть и может чего и испралю... Я добавил несколько фишек, кроме преобразования аля VCLtoKOL, которые часто мне (хотя наверное не только) нужны и которых иногда не хватает ... Дальше:
2Vedun: ссылка http://kolibdb.100free.com/files/KOLChart.zip битая
2Thaddy: Thanks!

теперь вопросы:
1) Кто знает как мне быть с функцией MessageDlg в VCL? MessageDlg очень часто используемая функция и ее надо бы иметь в модуле VCLtoKOL. Наверное здесь нужно будет создавать свою форму, на нее кидать кучу кнопок и иконку с меткой WordWrap. Использованеи MessageBox из модуля Windows не попрет т.к. в MessageDlg можно выставить произвольный набор кнопок и любую иконку (Warning, Error и т.п.), MessageBox этого не позволяет, на сколько я понял.

2) Вопрос наверное ни к месту, ну все таки, как програмно скомпилить полученную новую программу? Использование dcc32.exe FileName не дает того результата который нужен (например в Windows 98 появляется консоль которую нужно самому закрывать)


 
Vedun   (2005-12-26 10:23) [19]

2 BaryVetaL
Странно, сам проверял ссылку. Работала. Тогда я скину этот архив тебе на мыло.


 
MTsv DN ©   (2005-12-26 11:17) [20]

Привет...

Может я ошибаюсь, но кажется:
MessageDlg -> MessageBox, если стандартные кнопки MB_OK, MB_YES и т.д.    
MessageDlg -> KOL.ShowQuestion(Ex), если кнопки определяет пользователь...

С Уважением MTsv DN


 
BaryVetaL ©   (2005-12-26 12:02) [21]

2Vedun: Извини но я работаю в FireFox в IE почти никогда... Попробовал в FireFox показывает какую то картинку если перейти по ссылке, а IE предлагает сохранить файл... Так что в какой то степени виноват я...

2MTsv DN: ShowQuestionEx и MessageBox не дает полной аналогии с MessageDlg


 
Barloggg   (2005-12-26 12:23) [22]

Обычный ListView спокойно заменяет Stringgrid.
Ну, точнее не спокойно, придется много дорабатывать, но думаю как аналог сойдет очень даже нормально. Правда я еще сам не закончил эту работу по преобразованию.


 
BaryVetaL ©   (2005-12-26 13:09) [23]

Не Barloggg, лучше в моем новом модуле VCLtoKOL просто создать какой нибудь новый класс, который будет на основе KOLmdvXLGrid, добавить для аналога с VCL пару свойств и методов и все...


 
BaryVetaL ©   (2005-12-27 13:10) [24]

Кто знает в каком формате Delphi хранит рисуки в Image, понятно, что в dfm файле, но

...
 object Image1: TImage
   Left = 16
   Top = 132
   Width = 241
   Height = 217
   Picture.Data = {
     0A544A504547496D616765F1050000FFD8FFE000104A46494600010200006400
     640000FFEC00114475636B79000100040000003C0000FFEE000E41646F626500
     64C000000001FFDB0084000604040405040605050609060506090B080606080B
     0C0A0A0B0A0A0C100C0C0C0C0C0C100C0E0F100F0E0C1313141413131C1B1B1B
     1C1F1F1F1F1F1F1F1F1F1F010707070D0C0D181010181A1511151A1F1F1F1F1F
     1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F
     1F1F1F1F1F1F1F1F1F1F1F1FFFC0001108002D002D03011100021101031101FF
     C4008E0000030003010000000000000000000000040506020307000100030101
     0100000000000000000000000203040100051000010303020306040505000000
     00000002010304111205000621131431415161221532422307716224161781A1
     52335311000202010204030607000000000000000001110212210331418104A1
     3213F05161719122C1D1E142628214FFDA000C03010002110311003F0042F6E5
     CE46CB4A8C325A96EB1916A2358F56D39CE30E08911A282A2A597F1251B786BD
     FCDA7D48576D4754E1A9AB73CA42E4EE7DC12E663CB0C0DB50654D76101BE688
     4F2B026A6489CB7396356945178AFE5D65AEDF03B6FB6A553CFCCAA9FCA7A87C
     EDF73D86B1F968C1CB80C48763E7A118899B42C382D3A6063C56C53BBCD3C341
     6B07B5DAAD6AF8C7DAFE651E437464D77BE0F038C745B83249C4C8CAB44D54BA
     7390DB4DAAF0AD8DD497C0874BB3376B697A6ECF8F2FAC188EE8DDEDED899303
     24DF591F70FB436E2C76EDE424C489551FF2F55FFDB496515DBA64947ED9F092
     859CFEE673EE44CDBCB9044C64608A623C96B98BD44790E1229D3B8A3A53877E
     820EC2BE9CC6A4A61F6F4981372725E92321322FF50802D2B6A14016D06B79DD
     E904EE4D7A55D0F2B777159552518A8019DB01D7A747938DC9BB8E6DA9273498
     46C5E1E73A24264DA9AFD3BAF5AA714AF1A682D51FB7DD426AD5CB48E83B8DB2
     A3037121B263ED8D3525A951DE0275C7FABE2E913CA694525AAAFA5740D1CB7D
     B6DBF369D20DB84FB70F634B6F2C5C9217B238F3CE9C8649C7249BECAC7F51A3
     A1658D2A08F05EC4D298F7DC6594AF378060FDB4CF3B8A938E1CE4606A4E5573
     2AE7406A62F2C9495627EAD12DBC69D9D9A53636BBF5998E51C7A7B872D6C1DC
     6DEE893B993350D6649160099F6F7796891DA79A4A7EB2EE29217BFBB41905EA
     571C63C7F404E978F66AFC8F2711166A6E6A36720C082719B6A5449724C9F65C
     7490A22B5C12D75A4A173BC385342EC51B5B55756DCE8D78F41244DE1BD24E35
     B971931C869841CDBA2E34F0A2FA8AE647EAAD2A21F1AAF0F05EE5BB157F9F6D
     38D7CD8FB681392FB9D9E8B1A7BF0998E44DC5C6CD86C391DD256DA9A88AE149
     247C11102E411A222A92F6705D036329DAD749F7BF0E876988D1208DCA8A544A
     AA2512BE4955D26CC9921872FE969723208EE93CB56E449881CADB5899939B93
     25ABA60346D3468E1812347447111048782D52EFE9E5AC760EB6B250B808C762
     618371B6E3C11070B1E02639B804F388483CC57550C16824DADF6AB6554A517C
     B40D94ADDB63CF2992957676CCC83D291D8ECBEE6411AEB011D2FAA8C7169084
     4E8A8DFCA94E1DDA07632B7BA8F815B051831B59711C46FD2B42BD529E2B555A
     FE3A53672431E5FA34121413DD2796A8C89F1393EECCBE4636E86778B2DC95C1
     E025A636438222B18A1B8AAD4F7AB75CA412140694A7D2AEB64B76B6D638737A
     FE5EDF129570B8997F78979D158902EEDE17094C00D097ACB44B8A2A2FA7857C
     342DE80A6D6D7F6FC0D3BCB6CC0D953717BEB078D0B312AB0F2F0980143760CB
     710515A4FF00A32E90D8894F4FA7B342AD3A07B76774EADF12EF61ED66B05841
     128ED31939E673B2CAD0A2214B904AE38954ED1052B03F2A26976B4837B4B2A2
     CF4E960C095DE9F9657FC145BBF0A71ECD3B5144E07F1CFED07E9D1FED4A9F51
     D9D256FF005DDF2D2FF8BCFB75BAC8DFBB2FE47B03FC63EFB17DA3A3F7BE913A
     4E57FBFA2EEB3BF93E1F2D758E42B671AF01967BF607BFE13DFF00A3F7ABCFD8
     BAAB7997D42EE55DC2B7594FCD4A71D0EA7532871C0AC0B7BB4B04CF5869FFD9}
 end
...


Как мне попиксельно считать в PImage рисунок?
Поиск формата в лоб не работает :-)
Выяснил, что если сохранить рисунок, то

              /отсюда картинка...
(заголовок)FFD8FFE000104A464...(далее до конца рисунок)

как мне читать заголовок?

Заранее спасибо!


 
Muxaspb ©   (2005-12-27 13:40) [25]

Используй эту функцию:

procedure HexToStream(Hex: string; Buf: PStream);
const
 Convert: array["0".."f"] of SmallInt =
 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
   -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1,
   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
   -1, 10, 11, 12, 13, 14, 15);
var
 i, p: integer;
 B: Byte;
begin
 if Buf.Size < Length(Hex) div 2 then
   Buf.Size := Length(Hex) div 2;
 p := Buf.Position;
 Buf.Position := 0;
 i := 1;
 while i <= Length(Hex) do
 begin
   if not (Hex[i] in ["0".."f"])
     or not (Hex[i + 1] in ["0".."f"]) then
     Break;
   B := Byte((Convert[Hex[i]] shl 4) + Convert[Hex[i + 1]]);
   Buf.Write(B, 1);
   Inc(i, 2);
 end;
 Buf.Position := p;
end;


Например так:
var
 St: PStream;
begin
 St := NewMemoryStream(FileName);
 HexToStream(Memo1.Text, ST);
 St.Free;


дальше просо из памяти загружай рисунок.
Кстати в приведенном случае этот рисунок в JPG формате.


 
Muxaspb ©   (2005-12-27 13:41) [26]

<<Используй эту функцию:>>

Извините описался - процедуру.


 
Muxaspb ©   (2005-12-27 13:57) [27]

А эта функция наоборот:

function StreamToHex(Buf: PStream): string;
const
 Convert: array[0..15] of Char = "0123456789ABCDEF";
var
 i, p: integer;
 B: byte;
begin
 SetLength(Result, Buf.Size * 2);
 p := Buf.Position;
 Buf.Position := 0;
 for i := 1 to Buf.Size do
 begin
   Buf.Read(B, 1);
   Result[(i * 2) - 1] := Convert[B shr $4];
   Result[(i * 2)] := Convert[B and $F];
 end;
 Buf.Position := p;
end;


Полученный текст помещаем Picture.Data = {Сюда}


 
BaryVetaL ©   (2005-12-27 14:01) [28]

Кстати, а как определять тип рисунка? (jpg, bmp, ico...)


 
Muxaspb ©   (2005-12-27 14:40) [29]

По заголовку. Например, в bmp сигнатура BM, в jpg - JFIF, в ico не помню.
Можно посмотреть в исходниках каких-нибудь компонент для работы с графическими форматами.


 
Muxaspb ©   (2005-12-27 15:15) [30]

Внимательней посмотрел. В заголовке в Picture.Data может быть TJPEGImage, TGIFImage и т.д + какие-то параметры. Если это ImageList, то там будет IL.


 
Thaddy   (2005-12-27 23:16) [31]

2BarryVetal,

You can also use my GDIPLUS library to use like graphics.pas.
It is a wrapper for GDIPLUS.DLL that works from Windows 98 and is standard from ME/Win2000.
It automatically supports formats like GIF, JPEG, TIFF, BMP, WMF etc. and the DLL 3is almost always loaded anyway, because windows needs it. ;) Win95 doesn"t work.
I can mail you an updated version that can do even more.


 
BaryVetaL ©   (2005-12-28 09:22) [32]

2Thaddy: I need to consider only a picture from *.dfm a file, whether I do not know it is necessary to use your library, it can is possible easier? Well and if you not difficultly please send on barilkovetal@mail.ru. Thanks Thaddy!


 
BaryVetaL ©   (2005-12-28 15:28) [33]

2Muxaspb: Чего то не работает твой метод.


 
Muxaspb ©   (2005-12-28 16:54) [34]

А что не работает? Картинку на диск сохранить не смог или что?


 
BaryVetaL ©   (2005-12-29 13:04) [35]

Muxaspb мне нужно получить из dfm файла (VCL) картинку, и сконвертировать ее в PBitmap (KOL). Полученные после преобразования HexToStream, данные являются каким-то форматом хранения данных Delphi. Формат начинается с TBitmap......... или TJPEGImage..............

Через поток


 Str := NewStrList;
 St := NewMemoryStream;
 HexToStream(S, St);
 Str.LoadFromStream(St, false);
 // сохраним чтобы посмотреть что получилось
 Str.SaveToFile("1.bmp");
 // пытаемся загрузить
 Image1.Bitmap.LoadFromStream(St);  
 Image1.Refresh;


мы ничего не получим... Можешь проверить.


 
Muxaspb ©   (2005-12-29 18:56) [36]

BaryVetaL, надо удалять все лишние пробелы, энтэры, и заголовок. Я тебе на мыло скину пример, как делать. У меня все вышло.


 
BaryVetaL ©   (2005-12-30 09:18) [37]

Давай...


 
BaryVetaL ©   (2005-12-30 09:24) [38]

Спасибо! Обязательно тебя впишу как участника проекта VCL to KOL :-)



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

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

Наверх




Память: 0.58 MB
Время: 0.048 c
15-1159615411
Furyz
2006-09-30 15:23
2006.10.22
Windows Script


4-1149756324
Balkon
2006-06-08 12:45
2006.10.22
Необходимо ли операции с СОМ портом, выполняемые из различных..


15-1159327445
Pazitron_Brain
2006-09-27 07:24
2006.10.22
tesseract, с Днем рождения!


2-1159818990
AveyiS
2006-10-02 23:56
2006.10.22
Радио по сети


15-1159446171
Иксик
2006-09-28 16:22
2006.10.22
Гениально!