Перейти к содержимому

Фото
- - - - -

Xlib Pascal


  • Вы не можете создать новую тему
  • Please log in to reply
6 ответов в этой теме

#1 quant

quant
  • Пользователь
  • 294 сообщений
  • Откуда:КиберАдминск1

Отправлено 18 августа 2004 - 23:28

Вот решил я изучать паскаль.
Поставил компилятор fpc и решил скомпилить пример "Hello World" для GUI:
uses x,xlib,x11,xutil,strings;

const
     WND_X=0;
     WND_Y=0;
     WND_WDT=100;
     WND_HGH=100;
     WND_MIN_WDT=50;
     WND_MIN_HGH=50;
     WND_BORDER_WDT=5;
     WND_TITLE='Hello!';
     WND_ICON_TITLE='Hello!';
     PRG_CLASS='Hello!';

(*
* SetWindowManagerHints - процедура передает информацию о
* свойствах программы менеджеру окон.
*)

procedure SetWindowManagerHints (
 prDisplay : PDisplay; (*Указатель на структуру TDisplay *)
 psPrgClass : PChar; (*Класс программы *)
 argv : PPChar;   (*Аргументы программы *)
 argc : integer;    (*Число аргументов *)
 nWnd : TWindow;    (*Идентификатор окна *)
         x,     (*Координаты левого верхнего *)
         y,     (*угла окна *)
         nWidth,
         nHeight,  (*Ширина и высота окна *)
         nMinWidth,
         nMinHeight:integer; (*Минимальные ширина и высота окна *)
 psTitle     : PChar;  (*Заголовок окна *)
 psIconTitle : PChar;    (*Заголовок пиктограммы окна *)
 nIconPixmap : TPixmap    (*Рисунок пиктограммы *)
);

var
 rSizeHints : TXSizeHints; (*Рекомендации о размерах окна*)
 rWMHints : TXWMHints;
 rClassHint : TXClassHint;
 prWindowName, prIconName : TXTextProperty;
begin

 if ( XStringListToTextProperty (@psTitle, 1, @prWindowName )=0) or
    (XStringListToTextProperty (@psIconTitle, 1, @prIconName )=0 ) then
 begin
  writeln('No memory!');
  halt(1);
 end;

rSizeHints.flags := PPosition OR PSize OR PMinSize;
rSizeHints.min_width := nMinWidth;
rSizeHints.min_height := nMinHeight;
rWMHints.flags := StateHint OR IconPixmapHint OR InputHint;
rWMHints.initial_state := NormalState;
rWMHints.input := True;
rWMHints.icon_pixmap := nIconPixmap;

rClassHint.res_name := argv[0];
rClassHint.res_class := psPrgClass;

XSetWMProperties ( prDisplay, nWnd, @prWindowName,
  @prIconName, argv, argc, @rSizeHints, @rWMHints,
  @rClassHint );
end;

(*
*main - основная процедура программы
*)

//void main(int argc, char *argv[])
var
 prDisplay: PDisplay;  (* Указатель на структуру Display *)
 nScreenNum: integer;    (* Номер экрана *)
 prGC: TGC;
 rEvent: TXEvent;
 nWnd: TWindow;
begin

 (* Устанавливаем связь с сервером *)
 prDisplay := XOpenDisplay ( nil );
 if prDisplay = nil  then begin
  writeln('Can not connect to the X server!');
  halt ( 1 );
 end;

 (* Получаем номер основного экрана *)
 nScreenNum := XDefaultScreen ( prDisplay );

 (* Создаем окно *)
 nWnd := XCreateSimpleWindow ( prDisplay,
     XRootWindow ( prDisplay, nScreenNum ),
     WND_X, WND_Y, WND_WDT, WND_HGH, WND_BORDER_WDT,
     XBlackPixel ( prDisplay, nScreenNum ),
     XWhitePixel ( prDisplay, nScreenNum ) );

 (* Задаем рекомендации для менеджера окон *)
 SetWindowManagerHints ( prDisplay, PRG_CLASS, argv, argc,
   nWnd, WND_X, WND_Y, WND_WDT, WND_HGH, WND_MIN_WDT,
   WND_MIN_HGH, WND_TITLE, WND_ICON_TITLE, 0 );

 (* Выбираем события, обрабатываемые программой *)
 XSelectInput ( prDisplay, nWnd, ExposureMask OR KeyPressMask );

 (* Показываем окно *)
 XMapWindow ( prDisplay, nWnd );

 (* Цикл получения и обработки событий *)
 while ( true ) do begin
  XNextEvent ( prDisplay, @rEvent );

  case ( rEvent.eventtype ) of
    Expose :
    begin
     (* Запрос на перерисовку *)
     if ( rEvent.xexpose.count <> 0 ) then
      continue;

     prGC := XCreateGC ( prDisplay, nWnd, 0 , nil );

     XSetForeground ( prDisplay, prGC,
       XBlackPixel ( prDisplay, 0) );
     XDrawString ( prDisplay, nWnd, prGC, 10, 50,
       'Hello, world!', strlen ( 'Hello, world!' ) );
     XFreeGC ( prDisplay, prGC );
    end;

    KeyPress :
    begin
     (* Нажатие клавиши клавиатуры *)
     XCloseDisplay ( prDisplay );
     halt ( 0 );
    end;
  end;
 end;
end.

Библиотека xlib вроде установлена а он говорит:
Fatal: Can't find unit X

Что посоветуйте?
Да и незнаете где можно скачать хороший учебник по fpc на русском языке?

Сообщение изменено: Gb|k (18 августа 2004 - 23:31 )

  • 0

#2 tomatensaft

tomatensaft

    Samurai Jack

  • Пользователь
  • 449 сообщений
  • Откуда:Tallinn

Отправлено 19 августа 2004 - 00:21

Совет: изучение начинай с малого (приложения с GUI -- не самая простая тема). Да и на Паскале для X очень уж редко программы пишут...

Хотя конкретно по делу: попробуй убрать "x" из верхней строчки. Мне кажется, что "Xlib" должно хватать...

Сообщение изменено: tomatensaft (19 августа 2004 - 00:22 )

  • 0
"This is all I want'd t' say 'bout dat..." © Forest Gump

#3 quant

quant
  • Пользователь
  • 294 сообщений
  • Откуда:КиберАдминск1

Отправлено 19 августа 2004 - 00:26

Fatal: Can't find unit XLIB

Но ведь пишут же для Х и это факт :)
А начну я с малого конечно же но всё же надо добится чтобы работало..

Сообщение изменено: Gb|k (19 августа 2004 - 00:28 )

  • 0

#4 archi

archi
  • Пользователь
  • 84 сообщений
  • Откуда:Таллин

Отправлено 19 августа 2004 - 07:52

ну так ты по диску-то пошурши, посмотри где у тебя эти юниты лежат... убедись, что они действительно есть, что компилятор их видит, что ему не надо всякие пути к этим юнитам указывать...

Сообщение изменено: archi (19 августа 2004 - 07:53 )

  • 0

#5 quant

quant
  • Пользователь
  • 294 сообщений
  • Откуда:КиберАдминск1

Отправлено 19 августа 2004 - 15:23

archi, Да, ты прав спасибо, они оказались не установлены щас вот качаю их :)
  • 0

#6 quant

quant
  • Пользователь
  • 294 сообщений
  • Откуда:КиберАдминск1

Отправлено 19 августа 2004 - 17:26

Поставил все юниты которые только были найдены apt-cache search fp-unit*
И теперь он мне только говорит Fatal: Can't find unit X11
Может быть какую-нибудь библиотеку поставить дополнительно нужно?
  • 0

#7 quant

quant
  • Пользователь
  • 294 сообщений
  • Откуда:КиберАдминск1

Отправлено 21 августа 2004 - 18:51

УРА! получилось добрые люди с канала fpc помогли вот в чём была проблема:

"remove the x11 in the uses, and on line 112 remove the "eventtype" and change it to "_type" and it will compile and run"

Код кривой был :)
Теперь я могу спать спокойным сном...
  • 0