Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

Получение всех шрифтов системы   Найти похожие ветки 

 
Alexis ©   (2006-11-20 17:27) [0]

Добрый вечер!
Есть код, который должен компилироваться 16-битным BP v7.0 и сохранять структуры шрифтов в массив InstFonts. Вот как это работало на Delphi6

var
   fontCount : Integer;
   InstFonts : array of TLogFont;

function EnumFontsProc(var lf : TLogFont; var tm : TTextMetric; fontType : Longint; param : PInteger) : Integer; stdcall;
begin

   Inc(param^);
   SetLength(InstFonts, fontCount);

   InstFonts[fontCount - 1] := lf;
   Freemem(TmpPtr);
   EnumFontsProc := 1;
end;

function EnumerateFonts(DC : HDC) : Integer;
begin
   fontCount := 0;
   EnumFonts(DC, nil, @EnumFontsProc, @fontCount);
   EnumerateFonts := fontCount;
end;


Но в BP v7.0 нет динамич.массисов и ф-ции SetLength, но нужно, чтобы к InstFonts можно бы было обращаться по индексу для получения конкретного шрифта и я переделал код так:

var
   fontCount : Integer;
   InstFonts : ^TLogFont;
function EnumFontsProc(var lf : TLogFont; var tm : TTextMetric; fontType : Longint; param : PInteger) : Integer; far;
var
   TmpPtr : ^TLogFont;
   i : Integer;
begin

   Inc(param^);
   TmpPtr := Pointer(InstFonts);
   Getmem(InstFonts, fontCount * sizeof(TLogFont));

   for i := 0 to fontCount-2 do
   InstFonts^[i] := TmpPtr^[i]; //!!!

   InstFonts[fontCount - 1] := lf;
   Freemem(TmpPtr);
   EnumFontsProc := 1;
end;

function EnumerateFonts(DC : HDC) : Integer;
begin
   fontCount := 0;
   EnumFonts(GetDC(0), nil, @EnumFontsProc, @fontCount);
   EnumerateFonts := fontCount;
end;


Компил.жалуется на помеченную строку:wrong qualifier. Как тут надо изменить, ума не приложу, давно на Pascal не писал.
Заранее спасибо.


 
MBo ©   (2006-11-20 17:51) [1]

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


 
Alexis ©   (2006-11-20 18:54) [2]


> Кроме того, в обоих вариантах сделано плохо - перераспределение
> памяти на каждом шагу

Это я знаю, пока сделаю, чтоб просто работало, это академич.задание.


> объяви тип указателя на массив, а не на один элемент.

это как? А разве указатель на память не является по сути массивом? не могли бы пример привести, а то я после 2 лет перерыва C/C++ на Паскале с дикими муками пишу :)
Я пробовал вот так :
InstFonts : ^TLogFont[];
и так
InstFonts : ^(TLogFont[]);

все равно плохо :(


 
Anatoly Podgoretsky ©   (2006-11-20 19:37) [3]

> Alexis  (20.11.2006 17:27:00)  [0]

Под какую ОС то пишешь?


 
Alexis ©   (2006-11-20 19:47) [4]


> Anatoly Podgoretsky ©   (20.11.06 19:37) [3]

Под Win2000, WinXP, но надо, чтобы программа была 16-битной


 
Leonid Troyanovsky ©   (2006-11-20 19:49) [5]


> Alexis ©   (20.11.06 19:47) [4]

> Под Win2000, WinXP, но надо, чтобы программа была 16-битной


Я даже соглашусь думать над этой проблемой.
Но, скажи, ради Бога, а на зачем?

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2006-11-20 19:55) [6]

> Alexis  (20.11.2006 19:47:04)  [4]

Паскаль под ДОС? А он ничего про Виндоус не знает.


 
Leonid Troyanovsky ©   (2006-11-20 20:05) [7]


> Anatoly Podgoretsky ©   (20.11.06 19:55) [6]

> Паскаль под ДОС? А он ничего про Виндоус не знает.


Мне даже показалось, что ДОС под XP.

--
Regards, LVT.


 
Alexis ©   (2006-11-20 21:24) [8]


Leonid Troyanovsky ©   (20.11.06 19:49) [5]
> Я даже соглашусь думать над этой проблемой

Ловлю на слове! :)


> Но, скажи, ради Бога, а на зачем?

Предмет в универе - Интерактивные системы. Мы на голом API должны написать 16-битную/32-битную GUI програмки на С/Pascal. На С я уже обе версии и на Delphi6 32-битную версию асилил, проблема с pascal 16-бит. Нам нужно компилять это чудо Borland Pascal v7.0, а там разумеется нет ни динамич.массивов, ни SetLength и мне надо эмулировать дин. массив путем выделения памяти Getmem, но с Паскалем давно не работал и путаюсь с указателями.

В общем [0] :)


 
Alexis ©   (2006-11-20 21:28) [9]


> Anatoly Podgoretsky ©   (20.11.06 19:55) [6]  
> Паскаль под ДОС? А он ничего про Виндоус не знает


Знает!

program Keylook;
uses WinTypes, WinProcs, Strings;

function MainWindowProc(hWindow : HWND; msg : Word; wParam : Word; lParam : Longint) : Longint; export;
begin
...
end;

begin
   FillChar(windowClass, sizeof(TWndClass), 0);
   windowClass.style := CS_HREDRAW or CS_VREDRAW;
   windowClass.lpfnWndProc := @MainWindowProc;
   windowClass.cbClsExtra := 0;
   windowClass.cbWndExtra := 0;
   windowClass.hInstance := hInstance;
   windowClass.hIcon := LoadIcon(0, IDI_APPLICATION);
   windowClass.hCursor := LoadCursor(0, IDC_ARROW);
   windowClass.hbrBackground := CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
   windowClass.lpszMenuName := NIL;
   windowClass.lpszClassName := szWndClass;

   RegisterClass(windowClass);

   hWindow := CreateWindow(szWndClass, "KeyLook",
 WS_OVERLAPPEDWINDOW,
 Integer(CW_USEDEFAULT),
 Integer(CW_USEDEFAULT),
 Integer(CW_USEDEFAULT),
 Integer(CW_USEDEFAULT),
 HWND(nil),
 HMENU(nil),
 hInstance,
 nil
 );

   if (hWindow = 0) then
Exit;

   ShowWindow(hWindow, SW_SHOWNORMAL);
   UpdateWindow(hWindow);

   while (GetMessage(message, 0, 0, 0)) do
   begin
TranslateMessage(message);
DispatchMessage(message);
   end;

end.


BPC.exe -CW Program.pas


 
Leonid Troyanovsky ©   (2006-11-20 21:50) [10]


> Alexis ©   (20.11.06 21:24) [8]

> должны написать 16-битную/32-битную GUI програмки на С/Pascal.
>  На С я уже обе версии и на Delphi6 32-битную версию асилил,
>  проблема с pascal 16-бит. Нам нужно компилять это чудо
> Borland


Дык, а зачем Pascal v7.0? Достачно D1, IMHO.
Правда, там не было дин. массивов и пр.,
но, достаточно, Getmem vs SetLenght.

Правда, найти сейчас описание нужных функций
в msdn - достаточно нетривиальная задача.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-11-20 21:55) [11]


> Leonid Troyanovsky ©   (20.11.06 21:50) [10]

> в msdn - достаточно нетривиальная задача.


Чего-то я утомился.
Если есть описалово для с - давай сюда.
Т.е., проблема - в переводе с->d1.

--
Regards, LVT.


 
Alexis ©   (2006-11-20 22:06) [12]


> Если есть описалово для с - давай сюда.
> Т.е., проблема - в переводе с->d1.


int fontCount;
static LOGFONT *InstFonts; /*Installed fonts*/

int CALLBACK EnumFontsProc(const LOGFONT *lplf, const TEXTMETRIC *lptm, DWORD dwType, LPVOID lpParam) {
   fontCount = *((int far *)lpParam);
   fontCount++;
   InstFonts = (LOGFONT *)realloc(InstFonts, sizeof(LOGFONT) * fontCount);
   InstFonts[fontCount - 1] = *lplf;

   return 1;
}

int EnumerateFonts(HDC hdc) {
   fontCount = 0;
   EnumFonts(hdc, NULL, (FONTENUMPROC)EnumFontsProc, (LPARAM)&fontCount);
   return (fontCount);
   
}


Перебрать шрифты после вызова EnumerateFonts(GetWindowDC(hWnd)) можно так:

for (int i = 0; i < fontCount; i++)
     MessageBox(NULL, InstFonts[i].lfFaceName, "Fonts", MB_OK);

Как перевести в BP7.0 мой сишный код?


 
Юрий Зотов ©   (2006-11-21 03:11) [13]

> Alexis ©

Вариант - связанный список. Что-то вроде этого (не проверял, возможны ошибки):  

type
 PFontRecord = ^TFontRecord;
 TFontRecord = record
   Font: TLogFont;
   Next: PFontRecord
 end;
 
var
 FirstFontRecord: PFontRecord = nil;
 CurrentFontRecord: PFontRecord;
 FontCount: Integer = 0;
 
function EnumFontsProc(var LF: TLogFont; var TM: TTextMetric; FontType: Longint; Param: PInteger) : Integer; stdcall;
var
 NewFontRecord: PFontRecord;
begin
 Inc(Param^);
 New(NewFontRecord);
 NewFontRecord^.Font := LF;
 NewFontRecord^.Next := nil;
 if FirstFontRecord = nil then
   FirstFontRecord := NewFontRecord
 else
   CurrentFontRecord^.Next := NewFontRecord;
 CurrentFontRecord := NewFontRecord;
 EnumFontsProc := 1
end;

function EnumerateFonts(DC: HDC): Integer;
begin
 EnumerateFonts := EnumFonts(DC, nil, @EnumFontsProc, @FontCount)
end;

procedure DisposeFontRecords;
begin
 while FirstFontRecord <> nil do
 begin
   CurrentFontRecord := FirstFontRecord;
   FirstFontRecord := FirstFontRecord^.Next;
   Dispose(CurrentFontRecord)
 end
end;



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

Форум: "Основная";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.016 c
2-1166808842
ezorcist
2006-12-22 20:34
2007.01.14
Что означает ошибка "RLINK32" Out of memory!


2-1166729445
Frag
2006-12-21 22:30
2007.01.14
MDI...


2-1166633933
dreamse
2006-12-20 19:58
2007.01.14
Как правельно очистить переменную ?


15-1166456161
Ringo
2006-12-18 18:36
2007.01.14
О вредном излучении из системных блоков.


2-1166671454
4ert
2006-12-21 06:24
2007.01.14
function connect...





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