Double Commander
Модератор: Модераторы
Attid ты меня подтолкнул к интересной мысли:
Ведь можно и интерфейс таким же макаром изменять. Только выдавать интерфейсному плагу список компонентов главного окна... Приму эту методику, как запасной вариант.
PS.
Пока я вижу и для WLX и для WI(nterface)X одну проблему:
плаг использующий GTK api не будет работать в DC скомпиленом на GTK2 и на QT.
Как быть?
Пришли в башку следующие варианты:
1) Вынести листер в отдельное приложение и скомпилить под все три интерфейса, спрашивать плагин, какой интерфейс ему нужен и вызывать необходимый.
2)Забить и предоставить плагинописателям отдуваться - писать одно и то же для всех трех интерфейсов.
Лазаровцам, в принципе, все равно (перекомпилил под нужный интерфейс и все), а вот пишущие на чистом fpc или на С завоют.
3)Жёстко извращаться, создавая для плагина пустое окно на чистом апи нужного интерфейса.
Кто что посоветует, предложит?
Ведь можно и интерфейс таким же макаром изменять. Только выдавать интерфейсному плагу список компонентов главного окна... Приму эту методику, как запасной вариант.
PS.
Пока я вижу и для WLX и для WI(nterface)X одну проблему:
плаг использующий GTK api не будет работать в DC скомпиленом на GTK2 и на QT.
Как быть?
Пришли в башку следующие варианты:
1) Вынести листер в отдельное приложение и скомпилить под все три интерфейса, спрашивать плагин, какой интерфейс ему нужен и вызывать необходимый.
2)Забить и предоставить плагинописателям отдуваться - писать одно и то же для всех трех интерфейсов.
Лазаровцам, в принципе, все равно (перекомпилил под нужный интерфейс и все), а вот пишущие на чистом fpc или на С завоют.
3)Жёстко извращаться, создавая для плагина пустое окно на чистом апи нужного интерфейса.
Кто что посоветует, предложит?
- Attid
- долгожитель
- Сообщения: 2588
- Зарегистрирован: 27.10.2006 17:29:15
- Откуда: 44°32′23.63″N 41°2′25.2″E
- Контактная информация:
2 и 3 , я за 2 =) все равно к примеру для венды и линя не будешь одно и то же делать, хотя с Алексом мы нашли способ вызывать плагины ТС в лине без переделки, но не проверяли.
про интерфейс былоб конечно круто отделить ГУИ от ядра, но боюсь что не так то просто это будет сделать, наверно думать будем ближе к версии 3,0 =)
про интерфейс былоб конечно круто отделить ГУИ от ядра, но боюсь что не так то просто это будет сделать, наверно думать будем ближе к версии 3,0 =)
отя с Алексом мы нашли способ вызывать плагины ТС в лине без переделки, но не проверяли.
А можно поподробнее? Я думал поэксперементировать с winelib. А вы как?
Эксперимент показал, что две кнопочки из библы использующей первый GTK отлично создаются и работают в GTK2 приложении, вызывающем эту библиотеку:
Библа
Код: Выделить всё
library project1;
{$mode objfpc}{$H+}
uses
gtk,glib,gdk;
var GBox,GButton1,Gbutton2:PGtkWidget;
procedure ButtonToPanel(X:PGtkWidget); stdcall;
begin
gBox:=gtk_hbox_new(false,0);
gtk_container_set_border_width (GTK_CONTAINER (gBox), 2);
gtk_container_add(GTK_CONTAINER(X),GBox );
gtk_widget_show(gBox);
GButton1:=gtk_button_new_with_label('Yehoo1');
//gtk_container_add(GTK_CONTAINER(PGtkWidget(panel1.Handle)),GButton1);
gtk_container_add(GTK_CONTAINER(gBox),GButton1);
gtk_widget_show(GButton1);
Gbutton2:=gtk_button_new_with_label('Yehoo2');
gtk_container_add(GTK_CONTAINER(GBox),Gbutton2 );
gtk_widget_show(Gbutton2);
end;
exports ButtonToPanel;
begin
end.
Вызов:
Код: Выделить всё
procedure TForm1.Button5Click(Sender: TObject);
begin
Hlib:=LoadLibrary('path to lib.so');
if Hlib<>0 then
begin
Button5.Caption:='LoadLib OK';
Button7.Caption:='UnLoadLib';
end;
end;
procedure TForm1.Button6Click(Sender: TObject);
type TPro=procedure (X:PGtkWidget); stdcall;
var Proc:TPro;
begin
proc:=TPro(GetProcAddress(HLib,'ButtonToPanel'));
if proc <> nil then
begin
proc(PGtkWidget(Panel1.Handle));
end else showmessage('Error');
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
if UnloadLibrary(Hlib) then
begin
Button5.Caption:='LoadLib';
Button7.Caption:='UnLoadLib OK';
end;
end;
Правда неизвестно, как будет себя вести более сложный пример.
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
framepanel.pas(204,110) Error: Can't take the address of constant expressions
Решается очень просто:
1. добавляем в список используемых модулей uFileList
2.
Код: Выделить всё
var
ls: TFileList;
begin
....
ls := pnlFile.FileList;
pnlFile.VFS.VFSmodule.VFSList(ExtractDirLevel(pnlFile.VFS.ArcFullName, ActiveDir), ls);
...
end;
Я заметил, что большинство багов из трекера - исправлено. Остались в основном мелочи. Может стоит в свн вынести текущую ревизию в отдельные ветки и, подчистив, выпустить версию 0.4 альфа и 0.3 beta (или даже "0.3 почти stable"
)?
Зачем? Тестеры нужны. После выпуска новой версии всегда всплеск активности. Надо активность поддерживать.
Зачем? Тестеры нужны. После выпуска новой версии всегда всплеск активности. Надо активность поддерживать.
Создание ветки
svn copy http://doublecmd.svn.sourceforge.net/sv ... ecmd/trunk http://doublecmd.svn.sourceforge.net/sv ... hes/dc-0.3
Работать также, только рабочую копию берем из из нужной ветки.
svn copy http://doublecmd.svn.sourceforge.net/sv ... ecmd/trunk http://doublecmd.svn.sourceforge.net/sv ... hes/dc-0.3
Работать также, только рабочую копию берем из из нужной ветки.
