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

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

Автор: Maks150988
Дата сообщения: 09.11.2009 20:40
Приветствую, подскажите вот что. Есть у меня значения HDC (LongWord). Для уменьшенния объема кода решил пройтись в цикле и использовать по назначению вот такой-то соответсвующий HDC из массива. Надеюсь понятно объяснил чего хочу, для упрощения код с Boolean:


Код: const
MyArray: Array [Boolean] of Integer = (100, 101);
// использование
IntToStr(MyArray[TRUE]);
Автор: ValidolX
Дата сообщения: 09.11.2009 20:47
Maks150988

непонял размерность твоего массива, мож так вот -

const:
MyArray: array [0..2] of Integer = (100, 101, 102);


implementation
.....
IntToStr(MyArray[0]);
........


Цитата:
а то компилятор ругается мол объем больше 2 гб у типа данных.

а сообщение компилятора можно сюда?

Автор: Maks150988
Дата сообщения: 09.11.2009 21:04
ValidolX
Data type too large: exceeds 2 GB

Впринципе не помогло. Хотелось бы что-то типа таккого MyArray: Array [HDC] of Integer = (ptp.normalDC, ptp.pressDC, ptp.maskDC) или к кнадо правильнее.
Автор: psa1974
Дата сообщения: 09.11.2009 21:36
Maks150988
Ясное дело, что при объявлении константы типа Array [HDC] of Integer компилятор ругнется что выделяемый под тип разсер памяти больше 2 Гб! Посчитай сам: тип HDC (Longword) имеет минимальное значение 0, максимальное - 4294967295. Т.е. ты говоришь компилятору, что ты хочешь объявить константу типа массив, состоящий из 4294967296 элементов типа Integer. Считаем дальше, итого запрашиваемый размер: 4294967296 * SizeOf(Integer) = 4294967296 * 4 = 17179869184 байт или 16 Гб

А в варианте, подсказанном ValidolX ты выделяешь под тип константы такой размер:3* SizeOf(Integer) = 12 байт - все красиво!
Вот и думай
И еще вопрос: ptp.normalDC, ptp.pressDC, ptp.maskDC - это же вроде как дескрипторы контекстов каких-то устройств. Т.к. ты хочешь загнать их в константу, то ты уверен, что знаешь их в момент компиляции. Вопрос: как ты их знаешь?
Можно сделать так:

Код:
type
DCarray = (normalDC, pressDC, maskDC);
var
MyArray: array [DCarray] of integer;
begin
MyArray[normalDC]:= ptp.normalDC;
MyArray[pressDC]:= ptp.pressDC;
MyArray[maskDC]:= ptp.maskDC;
IntToStr(MyArray[pressDC]);
end;
Автор: Maks150988
Дата сообщения: 09.11.2009 22:00
psa1974
Я сначала создаю контексты при инициализации элемента управления, а вот этот массив нужен для функции, то есть к этому моменту дескрипторы контекстов уже есть. Все-таки придется подпроцедурку сделать и значения подсовывать ей чем привязываться к типам тем более что действительно меньше кода писать придется и возни меньше.
Автор: psa1974
Дата сообщения: 09.11.2009 22:15
Maks150988

Цитата:
сначала создаю контексты при инициализации элемента управления

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

Код: var i: DCarray;
for I := Low(MyArray) to High(MyArray) do
IntToStr(MyArray[i]);
Автор: Maks150988
Дата сообщения: 09.11.2009 22:22
psa1974
А, вот оно что. Я просто не знаю все возможности, стараюсь осваивать. Просто из-за 3 проходов циклом многовато коду как мне кажется, не стоит это всех этих лишних телодвижений, понимаю было бы 10 HDC в массиве на крайняк, тогда другое дело.
Автор: ValidolX
Дата сообщения: 09.11.2009 22:36

Цитата:
MyArray: array [Byte] of integer;, в этом случае ты потребуешь у компилятора память 256* SizeOf(Integer) = 256*4 = 1024 байт, или 1 Мбайт.


На самом деле меньше - 1 К (килобайт)


Цитата:
for I := Low(MyArray) to High(MyArray) do

вот ето самый класный варант итерации по масиву - всем так советую
плюсы - если изменились границы - цикл дальше правильно итерует по массиву!

Количество DC наперед известно или нет?
если да - делай свой тип, заполняй его екземпляр в коде и передавай куда надо
Автор: Maks150988
Дата сообщения: 09.11.2009 22:45
ValidolX
Да все известно. Вот код. Получилось вроде неплохо.


Код: procedure Trackbar_SetBmpImage(hWnd: THandle; pszFilePath: PWideChar; IsImgThumb: Boolean; hdcIn: HDC; var iWidth, iHeight: Integer);
var
dc : HDC;
himg: HBITMAP;

procedure GetThumbHbitmap(hdc: HDC; imgCount: Integer);
var
himgt: HBITMAP;
begin
himgt := GetBitmapFromHbitmap(himg, imgCount, iWidth, iHeight);
if (himgt <> 0) then
begin
SelectObject(hdc, himgt);
DeleteObject(himgt);
end;
end;

begin
dc := GetDC(hWnd);
//
himg := LoadImageW(0, pszFilePath, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (himg <> 0) then
begin
//
case IsImgThumb of
TRUE:
begin
GetBitmapWidthHeightW(himg, iWidth, iHeight);
iWidth := iWidth div 3;
//
GetThumbHbitmap(ptp.normalDC, 1);
GetThumbHbitmap(ptp.pressDC, 2);
GetThumbHbitmap(ptp.maskDC, 3);
end;
FALSE:
begin
GetBitmapWidthHeightW(himg, iWidth, iHeight);
SelectObject(hdcIn, himg);
end;
end;
//
DeleteObject(himg);
end;
//
ReleaseDC(hWnd, dc);
end;
Автор: psa1974
Дата сообщения: 09.11.2009 22:48
Maks150988
Чтобы не заморачиваться с типами, можно воспользоваться вариантом, предложенным ValidolX, только использовать не константу а переменную:

Код:
var
i: Byte;
MyArray: array [0..2] of HDC;
begin
// инициализация массива:
MyArray[0]:= ptp.normalDC;
MyArray[1]:= ptp.pressDC;
MyArray[2]:= ptp.maskDC;
// Использование:
for I := 0 to 2 do
IntToStr(MyArray[i]);
// или, принимая во внимание, что индекс самого меньшего элеменат массива = 0, так (так ты не привязываешься к количеству элементов массива и если оно изменится, код все равно будет работать):
for I := 0 to High(MyArray) do
IntToStr(MyArray[i]);
end;
Автор: Maks150988
Дата сообщения: 09.11.2009 23:04
Всем спасибо, пошел тренироваться.
Автор: psa1974
Дата сообщения: 09.11.2009 23:20
Maks150988
Еще замечание насчет контекстов: перед удалением объекта, выбранного в контекст, надо выбрать старый контекст назад, поскольку удалять можно только те объекты, которые не выбраны ни в одном контексте:


Код:
// выбираем новый объект в контекст, старый запоминаем:
himgtOld:= SelectObject(MyArray[i], himgt);
// что-то делаем...
...
// выбираем старый объект в контекст himgtOld, а тот с которым мы работали (himgt), удаляем:
DeleteObject(SelectObject(MyArray[i], himgtOld));
Автор: ValidolX
Дата сообщения: 09.11.2009 23:25
Maks150988

удачи!
пиши еще

Джентельмены, а может кто помочь мне с дебугером в Дельфи Лайт? (кидал проблему выше)
Автор: psa1974
Дата сообщения: 09.11.2009 23:54
ValidolX

Цитата:
не работает подсказка дебагера

а с самого начала работало?
На всякий проверь в "Tools"->"Options", и дальше в диалоге: "Editor Options"->"Code Insiqht" состояние опции "Code parameters" (это в Дельфи 2007 так, в Дельфи 2006 путь к опции может быть чуть другим, но смысл тот же)... Включена?
Автор: ValidolX
Дата сообщения: 10.11.2009 00:24
psa1974

да, все на месте. вот даже так -

http://tinypic.com/r/30mr7ys/4

меня бесспокоит вот етот коментарий в редми к дельфи-лайт -

- Refactoring, ErrorInsite, and ActiveX support have been disabled, as they
require the .NET Framework.

и вот ето

NOTE: There is no context-sensitive help, sorry. However, you can access the
help from the Delphi main menu or clicking on the Help icon in the toolbar.

Автор: psa1974
Дата сообщения: 10.11.2009 01:00
ValidolX
По-русски: "Рефакторинг, ErrorInsite и поддержка ActiveX отключены, так как они требуют .NET Framework". Наверное, в этом причина, потому что все настроки у тебя включены.
И контекстно-зависимая справка согласно приведенному примечанию, не должна работать.
Я думаю, лучше всего тебе ответит автор Лайтовской сборки - feandy. Запости этот вопрос ему в ПМ...
Автор: ValidolX
Дата сообщения: 10.11.2009 01:27
psa1974

имею две сборки дельфи-лайта
DELPHI 10 LITE v3.0 [SP1 Integrated]
и
DELPHI 10 LITE v4.1 [SP2 Integrated, HotFix Rollup 2 Integrated]

автор не указан ни в одной, к сожалению, но похоже автор 1 и тот-же (упаковка инстала и текст - похожи)
откуда знаешь что ето feandy? (зуб даешь ? )

2) мож есть где ветка форума по лайт сбокам здесь?

из всего приведенного только ErrorInsite OFF может (наверно) быть связана с дебугером.... все остальное имхо не то.
Автор: psa1974
Дата сообщения: 10.11.2009 01:48
ValidolX

Цитата:
зуб даешь ?

Даю! В подтверждение - ссылка RAD Studio 2009 Lite (v12.0.3370.20184) из шапки топика Embarcadero (CodeGear) RAD Studio 2009, в которой видно авторство Лайтовской сборки, а также свежайшее сообщение feandy: http://forum.ru-board.com/topic.cgi?forum=35&topic=44011&start=920#2
из которого следует, что автор Лайтовской сборки именно он (так же как и портабле-версии)...
Насчет
Цитата:
мож есть где ветка форума по лайт сбокам здесь?
не скажу, просто не интересовался.
Автор: data man
Дата сообщения: 10.11.2009 08:13
ValidolX

Цитата:
мож есть где ветка форума по лайт сбокам здесь?

Есть Delphi Lite
Автор: Cryogen2003
Дата сообщения: 10.11.2009 08:45
Люди добрые, помогите. Есть принтер для печати штрих-кодов. Как из дельфей запихнуть в него какой-то штрих-код на печать.
Автор: onewin
Дата сообщения: 10.11.2009 09:42
В фаст репорте есть удобные компоненты для печати штрих кодов.
Автор: Cryogen2003
Дата сообщения: 10.11.2009 09:45
onewin
Секунду, а разве на такой принтер надо отправлять изображение штрих-кода, а не определенную последовательность символов?
Автор: onewin
Дата сообщения: 10.11.2009 10:24
Ага, так Вы имели ввиду спец принтер. Так, насколько я знаю, эти принтеры могут печатать не только штрих-код но и любой текст и картинки. Все зависит от модели.
На пишите модель принтера, может что прийдет на ум. )
Автор: Cryogen2003
Дата сообщения: 10.11.2009 10:28
onewin
TLP 2844. Брался на зебре, пока на тесты еще не дали, чтобы программить под него.
Автор: onewin
Дата сообщения: 10.11.2009 10:57
Это же вроде тоже зебра. Под нее непрограммил.
А на офсайте есть мануал по программированию.
Автор: Cryogen2003
Дата сообщения: 10.11.2009 11:05
onewin
А ссылкой пульнуть не можешь? Не нашел я чего-то мануала
Автор: onewin
Дата сообщения: 10.11.2009 11:06
www_zebra_com/id/zebra/na/en/index/products/printers/desktop/tlp2844.4.tabs.html
Автор: Cryogen2003
Дата сообщения: 10.11.2009 11:09
onewin
Спасибо.

Кстати, если смотреть по этой ссылке, то там язык команд EPL2. Не уж то никто не программил на нем?
Автор: Kursist
Дата сообщения: 12.11.2009 13:07
Помогите, пожалуйста.
Есть форма, на ней текст выводится средствами ОпенГЛ.
Нужно ввести 8 символов с клавиатуры.

(а вводится и сохраняется только один символ)

//------------------INSERT GAMER NAME----------------------------------------------
procedure TFrmMain36.FormKeyPress(Sender: TObject; var Key: Char);
var
S:Char;
Str:string[8];
loop:Integer;
begin
if EditNameMode then
for loop := 1 to 8 do
begin
Str:=Str[loop]+Key;
//Str[loop]:=Key;
end;
if Str<>'' then
begin
GamerNameString.Clear;
GamerNameString.Add(Str);
GamerNameString.SaveToFile('resorces/gamerName.txt');
apStrings.Strings.Strings[13]:=GamerNameString.Strings[0];
end;

end;
Автор: akaGM
Дата сообщения: 12.11.2009 13:28
Kursist
у тебя Str: -- внутренняя переменная, поэтому и возвращается значение последнего вызова обработчика, сделай её, например, хотя бы членом TFrmMain36
и
Str:=Str[loop]+Key; -- тоже неверно
внутри обработчика вместо цикла просто поставь
Str := Str + Key;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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