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

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

Автор: Maks150988
Дата сообщения: 24.06.2008 15:53
OdesitVadim
Они ведь еще мучают программу протекторами дополнительно. Там вообще наверное сплошной ахтунг потом в коде...

Mandor Sawall
Да, блин, надо всего-лишь было сделать глобальными переменными. =)
Раньше CheckComboRootKey возвращала результат как HKEY (он вроде итак как DWORD). Потом я просто поменял на Longint. Один фиг компилятор проглотил...))
Автор: OdesitVadim
Дата сообщения: 24.06.2008 17:05
Maks150988
Просто учись писать красиво. Вначале это сложно, но потом привыкаешь и не понимаешь, как можно вообще было так писать. Код становиться чистым и понятным. Многие глюки просто не могут возникнуть.
Запомни, что писать код могут и индусы. но вот заставить его адекватно работать - значительно меньше. А написать красиво код - вообще единицы. Такие программеры восстребованы.

Цитата:
Раньше CheckComboRootKey возвращала результат как HKEY (он вроде итак как DWORD)

В самой виндовс очень много таких типов, которые есть 4байтовыми. Но я бы настойчиво рекомендовал использовать именно специализированные типы. Как только выйдет 64битный компилятор для Делфи (я надеюсь, что он будет), твоя программа на DWORD перестанет компилироваться. А в некоторых случаях компиляция будет проходить, но потом будет программа глючить через раз. Оно тебе надо?
Автор: dmitriyku
Дата сообщения: 24.06.2008 17:34
Как сделать смайлы в чате кликабельными?

Пишу чат на Delphi 6. Сообщения чата отображаются в компоненте TWebBrowser. Само сообщение пишется в компоненте TMemo. Смайлы выбираются из другой формы с компонентом TWebBrowser. На этой отдельной форме юзер видит список из двух колонок: первая колонка - картинка-смайл, вторая колонка - его текстовое обозначение.
Примерно так
WebBrowser1.Navigate('about:<html><body></body></html>');
(WebBrowser1.Document as IHtmlDocument2).body.innerText:='';
s:='<img src="smile1.gif"> :smile:';
(WebBrowser1.Document as IHtmlDocument2).body.insertAdjacentHTML('beforeEnd ', s);

На данный момент выборка смайла и вставка его в сообщение производится методом копи-пасте, т.е. текстовое обозначение смайла ":smile:" копируется в TMemo. Естественно это не удобно. Хочется сделать вставку обозначения смайла в TMemo по нажатию левой кнопки мыши на картинку смайла. Для этого надо каким-то образом получить событие от TWebBrowser о том на каком объекте был произведен клик.

Вопрос. Как это сделать?

Автор: OdesitVadim
Дата сообщения: 24.06.2008 18:05
предлагаю такую технологию. Все смайлы заключаем в тег a и делаем ссылку.
При клике, броузер будет пытаться перейти по ссылке и это можно будет перехватить в OnBeforeNavigate (вроде так называется). ПРи этом форму закрываем, а текст имеем.
Автор: dmitriyku
Дата сообщения: 24.06.2008 18:58
Очень интересно. Завтра же опробую. Спасибо.
Автор: Maks150988
Дата сообщения: 24.06.2008 20:46

Цитата:
Оно тебе надо?

Да я поправил на hkey.

Кстати, кто может помочь с процедуркой распечатывания текста. Я немного не пойму. Вроде весь текст с эдита подаю на печать, а на печать не выводятся поля ключа реестра и имя программы. Это я проверяю в программке FilePrint. Может в настоящем принтере все нормально... И как изменить зазор между строками в тексте? А то получается такой мелкий список из 15 "сканировамнных авторанок" на 2 листа печати тянет. Сразу скажу - этот код брал с какого-то немецкого форума.
Автор: OdesitVadim
Дата сообщения: 25.06.2008 10:09
Maks150988
Ну если бы ты намекнул, как печатаешь, но подозреваю, что используешь канву принтера (+ GDI функции, ты же на АПИ мутишь). Тогда надо помнить одно - на экране DPI обычно или 96 или 120. А даже у плохого принтера оно обычно 300. Вот и получается, что картинка в 3 раза меньше.
А зазор между строками - показуй, как выводишь.
Автор: Maks150988
Дата сообщения: 25.06.2008 13:10
OdesitVadim
Да, в процедуре PrintDocument используется GDI. Создается контекст и на него все накладывается. Еще есть функция Explode и думаю что там многое от нее зависит - ентеры разделяет новой строкой кажись.
Просто хотелось бы чтоб как в Блокноте текст распечатался - все прекрасно видно, переходы на новую строку есть и межстрочное расстояние в норме. Исходник программки на предыдущей странице. Даже не знаю что там подправить нужно.
Автор: OdesitVadim
Дата сообщения: 25.06.2008 13:28
Посмотрел исходники. Не вижу я там процедуры печати.
Хотя если надо только текст напечатать, то можно использовать старый фокус - создаём такстовый документ, а потом запускаем блокнот с такими параметрами /p имяфайла. Откроется окно печати. Также можно и вордпад запускать и печатать rtf.
Автор: Maks150988
Дата сообщения: 25.06.2008 13:45
Dialog_Result.inc
Тут просто код.
Автор: OdesitVadim
Дата сообщения: 25.06.2008 13:57
Посмотрел. там в коде явно написано "ахтунг", правда на немецком, с припиской, весь вывод рассчитан для разрешения 1/10мм, что соответствует приблизительно 250 dpi. Если у тебя лазерный принтер, то там это значение как минимум 600 - вот и поуменьшалось. Но размер шрифта то рассчитывается правильно - вот промежутки и уменьшились.
Надо начинать плясать от тех "10", что розбросаны по коду этой процедуры (PrintDocument). Заменить её переменной. А потом научиться рассчитывать её по текущему значению.
Автор: Maks150988
Дата сообщения: 25.06.2008 15:14
Ну с переменной тогда понятно. Так... А что имеется ввиду расчета - нет. Откуда "плясать" начинать?
Автор: OdesitVadim
Дата сообщения: 25.06.2008 15:20
от dpi принтера.
Автор: Maks150988
Дата сообщения: 25.06.2008 16:46
Немного поизменял код. Получилось так:


Код:
procedure PrintDocument(Printer, Text : String);
const
BORDERLEFT = 20;
BORDERRIGHT = 20;
BORDERTOP = 20;
BORDERBOTTOM = 20;
var
TextDC : HDC;
DocInfo : TDocInfo;
PageW, PageH, NewFont, OldFont, Paragraphs, Index, cntChars, TextHeight, CountPage : Integer;
TextString : String;
Size : TSize;
TextMetric : TTextMetric;
TextRect : TRect;
StringDynArray : TStringDynArray;
begin
StringDynArray := nil;

TextDC := CreateDC(nil, PChar(Printer), nil, nil);
if TextDC <> 0 then
begin
// MaЯeinheit auf 1/10 mm und Koordinatensystem umstellen
SetMapMode(TextDC, MM_LOMETRIC);
// Seitenbreite und -hцhe ermitteln
// Achtung: Angaben in mm
PageW := GetDeviceCaps(TextDC, HORZSIZE);
PageH := GetDeviceCaps(TextDC, VERTSIZE);

// Создаем шрифт и применяем его к контексту устройства
NewFont := CreateFont(36, 0, 0, 0, 400, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, 'Lucida Console');
OldFont := SelectObject(TextDC, NewFont);

// Получаем метрики текста для текущего выбранного шрифта
GetTextMetrics(TextDC, TextMetric);

// Подготавливаем имя документа
ZeroMemory(@DocInfo, SizeOf(DocInfo));
DocInfo.cbSize := SizeOf(DocInfo);
DocInfo.lpszDocName := 'Документ';

// Подстраховка что многостраничный документ не будет разделен в очереди печати
StartDoc(TextDC, DocInfo);

// Выставляем прозрачность фона текста
SetBkMode(TextDC, TRANSPARENT);

Index := 1;

// Номер первой страницы
CountPage := 1;

StringDynArray := Explode(#13#10, Text);

for Paragraphs := 0 to length(StringDynArray) - 1 do
begin
TextString := StringDynArray[Paragraphs];
if TextString = '' then Continue;
repeat
// Seitenkopf
MoveToEx(TextDC, BORDERLEFT * 10, - BORDERTOP * 10, nil);
LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - BORDERTOP * 10);
TextRect.Left := BORDERLEFT * 10;
TextRect.Top := - BORDERTOP * 10 + TextMetric.tmHeight;
TextRect.Right := PageW * 10 - BORDERRIGHT * 10;
TextRect.Bottom := TextRect.Top - TextMetric.tmHeight;
DrawText(TextDC, PChar('Список загружаемых приложений'), Length('Список загружаемых приложений'), TextRect, DT_CENTER);

// Text in Zeнlen umbrechen
GetTextExtentExPoint(TextDC, PChar(TextString), length(TextString), (PageW * 10) - (BORDERLEFT * 10) - (BORDERRIGHT * 10), @cntChars, nil, Size);

while (TextString[cntChars] <> ' ') do Dec(cntChars);
// Text ausgeben
// Achtung: Angaben in 1/10 mm
TextOut(TextDC, BORDERLEFT * 10, - (BORDERTOP * 10) + - Index * (Size.cy - 10), PChar(TextString), cntChars);
Delete(TextString, 1, cntChars);
Inc(Index);

// wenn Hцhe aller Zeilen grцЯer der Seitenhцhe, neu Seite anfangen
TextHeight := Index * (TextMetric.tmHeight div 10) + BORDERTOP + BORDERBOTTOM;
if TextHeight >= PageH - BORDERTOP - BORDERBOTTOM then
begin
// SeitenfuЯ
MoveToEx(TextDC, BORDERLEFT * 10, - (PageH - BORDERTOP) * 10, nil);
LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - (PageH - BORDERTOP) * 10);
TextRect.Left := BORDERLEFT * 10;
TextRect.Top := - (PageH - BORDERTOP) * 10 - 10;
TextRect.Right := PageW * 10 - BORDERRIGHT * 10;
TextRect.Bottom := TextRect.Top - TextMetric.tmHeight;
DrawText(TextDC, PChar(IntToStr(CountPage)), length(IntToStr(CountPage)), TextRect, DT_RIGHT);
// neue Seite
EndPage(TextDC);
Inc(CountPage);
// Zeilenzдhler zurьcksetzen
Index := 1;
end;
until
CntChars < 1;
end;
// SeitenfuЯ der letzten Seite
MoveToEx(TextDC, BORDERLEFT * 10, - (PageH - BORDERTOP) * 10, nil);
LineTo(TextDC, PageW * 10 - BORDERRIGHT * 10, - (PageH - BORDERTOP) * 10);
TextRect.Left := BORDERLEFT * 10;
TextRect.Top := - (PageH - BORDERTOP) * 10 - 10;
TextRect.Right := PageW * 10 - BORDERRIGHT * 10;
TextRect.Bottom := TextRect.Top - TextMetric.tmHeight;
DrawText(TextDC, PChar(IntToStr(CountPage)), length(IntToStr(CountPage)), TextRect, DT_RIGHT);
// Druck abschlieЯen
EndDoc(TextDC);
// ursprьngliche Schrift wieder in den DC selektieren
SelectObject(TextDC, OldFont);
// DC lцschen
DeleteDC(TextDC);
end
else
Messagebox(hApp, PChar(SysErrorMessage(GetLastError)), nil, MB_ICONSTOP);
end;
Автор: OdesitVadim
Дата сообщения: 25.06.2008 17:28
Правильно, он и не будет до конца, так как кол-во строк, которые надо вывести на экран, расчитывается согласно dpi.
Не с той стороны лечишь. Ты пытаешься устранить последствия, а надо устранять причину.
Автор: Maks150988
Дата сообщения: 25.06.2008 19:22
Доктор, выпишите правильный подробный рецепт.
Допустим принтер HP LaseJet 1018. Качество печати по дефолту у него в свойствах 600 точек на дюйм. Как dpi правильно то рассчитать. Не не знаю я...
Автор: SergBSI
Дата сообщения: 25.06.2008 21:59
Подбросте ссылку как из XML читать данные в базу и наоборот - примерчик Желательно с динамическим управлением

Добавлено:
- нет ли примера расчета градиентом температуры в теле
Автор: OdesitVadim
Дата сообщения: 26.06.2008 10:28
Maks150988
600 точек на дюйм - это как раз и есть dpi (dot per inch)SergBSI

Цитата:
- нет ли примера расчета градиентом температуры в теле

Вам к врачу. или физику. Смотря что понимается под словом тело
Автор: Maks150988
Дата сообщения: 26.06.2008 16:00
OdesitVadim
так как надо устранить причину.
Автор: OdesitVadim
Дата сообщения: 26.06.2008 16:22
я же писал. для начала замени число 10, которое там встречается при расчёте позиций на листе на переменную, которой для начала присвоишь 10. Потом потом сделаешь его равным dpi/25.4 (25,4 - это длина в мм одного дюйма. Возможно прийдётся здесь вписать 30, а может и другое число). Возможно где то прийдётся поправить константы или написать формулы пересчёта по dpi. Сам dpi можно у принтера запросить.
Автор: Maks150988
Дата сообщения: 26.06.2008 21:00
все, поборол эту напасть. 15 поставил и все умещается. теперь хочется узнать почему не выводятся на печать имена элеметов и их ключи реестра. тупо поля пустые.
Автор: OdesitVadim
Дата сообщения: 27.06.2008 10:27
ну значит действительно пустые.
Автор: Maks150988
Дата сообщения: 27.06.2008 13:33
Ммм... Ну допустим имеем текст, взятый из эдита:


Код:
Элемент : SRS Audio Sandbox
Команда : "C:\Program Files\SRS Labs\Audio Sandbox\srsssc.exe" /hideme
Размещение : HKEY_CURRENT_USER\..\Run
Автор: OdesitVadim
Дата сообщения: 27.06.2008 14:44
чувствую глюк функции, которая разбивает строки по пробелам.
Автор: Maks150988
Дата сообщения: 27.06.2008 16:07
Эх, ну ладно. Не велика проблема.
Теперь вот следующее. Неоходимо перевести код юнита Спектрума для плейера с VCL на API.

[more]unit uSpectrum;

interface

uses
Windows, Graphics, SysUtils, Classes;

type
TWaveData = array [0..2048] of DWORD;
TFFTData = array [0..512] of Single;

type
TSpectrum = class(TObject)
private
VisBuff: TBitmap;
BackBmp: TBitmap;
BkColor: TColor;
SpecHeight: Integer;
PenColor: TColor;
PenMask: TColor;
PeakColor: TColor;
FPenSolid: Boolean;
DrawType: Integer;
DrawRes: Integer;
FrmClear: Boolean;
UseBkg: Boolean;
PeakFall: Integer;
LineFall: Integer;
ColWidth: Integer;
ShowPeak: Boolean;
FFTPeacks: array [0..128] of Integer;
FFTFallOff: array [0..128] of Integer;
public
constructor Create(Width, Height: Integer);
procedure Draw(HWND: THandle; FFTData: TFFTData; X, Y: Integer);
property BackColor: TColor read BkColor write BkColor;
property Height: Integer read SpecHeight write SpecHeight;
property Width: Integer read ColWidth write ColWidth;
property Pen: TColor read PenColor write PenColor;
property Mask: TColor read PenMask write PenMask;
property Peak: TColor read PeakColor write PeakColor;
property PenSolid: Boolean read FPenSolid write FPenSolid;
property Mode: Integer read DrawType write DrawType;
property Res: Integer read DrawRes write DrawRes;
property FrameClear: Boolean read FrmClear write FrmClear;
property PeakFallOff: Integer read PeakFall write PeakFall;
property LineFallOff: Integer read LineFall write LineFall;
property DrawPeak: Boolean read ShowPeak write ShowPeak;
end;

var
Spectrum: TSpectrum;

implementation

function GetLightColor(const Color: TColor; const Light: Byte): TColor;
var
R, G, B: Byte;
begin
R:= GetRValue(Color);
G:= GetGValue(Color);
B:= GetBValue(Color);
Result:= RGB(
Round(R + (255 - R) * (Light / 100)),
Round(G + (255 - G) * (Light / 100)),
Round(B + (255 - B) * (Light / 100)));
end;

constructor TSpectrum.Create(Width, Height: Integer);
begin
VisBuff:= TBitmap.Create;
BackBmp:= TBitmap.Create;
VisBuff.Width:= Width;
VisBuff.Height:= Height;
BackBmp.Width:= Width;
BackBmp.Height:= Height;
BkColor:= clBlack;
SpecHeight:= 100;
PenColor:= clBlack;
PenMask:= clBlack;
PeakColor:= clWhite;
FPenSolid:= False;
DrawType:= 1;
DrawRes:= 1;
FrmClear:= True;
UseBkg:= False;
PeakFall:= 1;
LineFall:= 3;
ColWidth:= 3;
ShowPeak:= True;
end;

procedure TSpectrum.Draw(HWND: THandle; FFTData: TFFTData; X, Y: Integer);
var
I, J, YPos: LongInt;
YVal: Single;
R, G, B: Integer;
begin
if FrmClear then
begin
VisBuff.Canvas.Pen.Color:= BkColor;
VisBuff.Canvas.Brush.Color:= BkColor;
VisBuff.Canvas.Rectangle(0, 0, VisBuff.Width, VisBuff.Height);
if UseBkg then
VisBuff.Canvas.CopyRect(Rect(0, 0, BackBmp.Width, BackBmp.Height),
BackBmp.Canvas, Rect(0, 0, BackBmp.Width, BackBmp.Height));
end;
VisBuff.Canvas.Pen.Color:= PenColor;
for I:= 0 to 128 do
begin
YVal:= Abs(FFTData[(I * DrawRes) + 5]);
YPos:= Trunc((YVal) * 500);
if YPos > Height then YPos:= SpecHeight;
if YPos >= FFTPeacks[I] then
FFTPeacks[I]:= YPos
else
FFTPeacks[I]:= FFTPeacks[I] - PeakFall;
if YPos >= FFTFallOff[I] then
FFTFallOff[I]:= YPos
else
FFTFallOff[I]:= FFTFallOff[I] - LineFall;
if (VisBuff.Height - FFTPeacks[I]) > VisBuff.Height then FFTPeacks[I]:= 0;
if (VisBuff.Height - FFTFallOff[I]) > VisBuff.Height then FFTFallOff[I]:= 0;
case DrawType of
0:
begin
VisBuff.Canvas.MoveTo(X + I, Y + VisBuff.Height);
VisBuff.Canvas.LineTo(X + I, Y + VisBuff.Height - FFTFallOff[I]);
if ShowPeak then
VisBuff.Canvas.Pixels[X + I, Y + VisBuff.Height - FFTPeacks[I]]:= Pen;
end;
1:
begin
if ShowPeak then
begin
VisBuff.Canvas.Pen.Color:= PeakColor;
VisBuff.Canvas.MoveTo(X + I * (ColWidth + 1), Y + VisBuff.Height - FFTPeacks[I]);
VisBuff.Canvas.LineTo(X + I * (ColWidth + 1) + ColWidth, Y + VisBuff.Height - FFTPeacks[I]);
end;
if not FPenSolid then
begin
R:= GetRValue(GetLightColor(PenColor, GetRValue(PenMask)));
G:= GetGValue(GetLightColor(PenColor, GetGValue(PenMask)));
B:= GetBValue(GetLightColor(PenColor, GetBValue(PenMask)));
for J:= Y + VisBuff.Height - FFTFallOff[I] to Y + VisBuff.Height do
begin
if J > Height / 2 then
Dec(R, Trunc(256 / Height));
if J > Height / 2 then
Dec(G, Trunc(256 / Height));
if J > Height / 2 then
Dec(B, Trunc(256 / Height));
if R < 0 then R:= 0;
if G < 0 then G:= 0;
if B < 0 then B:= 0;
VisBuff.Canvas.Pen.Color:= TColor(RGB(R, G, B));
VisBuff.Canvas.Brush.Color:= TColor(RGB(R, G, B));
VisBuff.Canvas.Rectangle(X + I * (ColWidth + 1), J,
X + I * (ColWidth + 1) + ColWidth, J + 1);
end;
end else begin
VisBuff.Canvas.Pen.Color:= PenColor;
VisBuff.Canvas.Brush.Color:= PenColor;
VisBuff.Canvas.Rectangle(X + I * (ColWidth + 1), Y + VisBuff.Height -
FFTFallOff[I], X + I * (ColWidth + 1) + ColWidth, Y + VisBuff.Height);
end;
end;
end;
end;
BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, SRCCOPY);
end;

end.
[/more]

Ну надо избавиться от TBitmap.Create и Canvas. Получилось вот что:

[more]unit uSpectrum;

interface

uses
Windows;

type
TWaveData = array [0..2048] of DWORD;
TFFTData = array [0..512] of Single;
TColor = -$7FFFFFFF-1..$7FFFFFFF;

TSpectrum = class(TObject)
private
VisBuff: hBitmap;
BackBmp: TBitmap;
BkColor: TColor;
SpecHeight: Integer;
PenColor: TColor;
PenMask: TColor;
PeakColor: TColor;
FPenSolid: Boolean;
DrawType: Integer;
DrawRes: Integer;
FrmClear: Boolean;
UseBkg: Boolean;
PeakFall: Integer;
LineFall: Integer;
ColWidth: Integer;
ShowPeak: Boolean;
FFTPeacks: array [0..128] of Integer;
FFTFallOff: array [0..128] of Integer;
public
constructor Create(Width, Height: Integer);
procedure Draw(HWND: THandle; FFTData: TFFTData; X, Y: Integer);
property BackColor: TColor read BkColor write BkColor;
property Height: Integer read SpecHeight write SpecHeight;
property Width: Integer read ColWidth write ColWidth;
property Pen: TColor read PenColor write PenColor;
property Mask: TColor read PenMask write PenMask;
property Peak: TColor read PeakColor write PeakColor;
property PenSolid: Boolean read FPenSolid write FPenSolid;
property Mode: Integer read DrawType write DrawType;
property Res: Integer read DrawRes write DrawRes;
property FrameClear: Boolean read FrmClear write FrmClear;
property PeakFallOff: Integer read PeakFall write PeakFall;
property LineFallOff: Integer read LineFall write LineFall;
property DrawPeak: Boolean read ShowPeak write ShowPeak;
end;

var
Spectrum : TSpectrum;
VisBuffDC : HDC;
BmpInfo : tagBITMAP;
BmpDC : HDC;
hBMP : HBITMAP;
bits : Pointer;

implementation

function GetLightColor(const Color: TColor; const Light: Byte): TColor;
var
R, G, B: Byte;
begin
R:= GetRValue(Color);
G:= GetGValue(Color);
B:= GetBValue(Color);
Result:= RGB(
Round(R + (255 - R) * (Light / 100)),
Round(G + (255 - G) * (Light / 100)),
Round(B + (255 - B) * (Light / 100)));
end;

procedure CreateBitmap32(width, height: Word);
var
bmi: BITMAPINFO;
begin
BmpDC := CreateCompatibleDC(0);

with bmi do
begin
bmiHeader.biSize := SizeOF(bmi.bmiHeader);
bmiHeader.biWidth := width;
bmiHeader.biHeight := -height;
bmiHeader.biPlanes := 1;
bmiHeader.biBitCount := 32;
bmiHeader.biCompression := BI_RGB;
bmiHeader.biSizeImage := 0;
bmiHeader.biXPelsPerMeter := 0;
bmiHeader.biYPelsPerMeter := 0;
bmiHeader.biClrUsed := 0;
bmiHeader.biClrImportant := 0;
end;

hBMP := CreateDIBSection(BmpDC, bmi, DIB_RGB_COLORS, bits, 0, 0);
SelectObject(BmpDC, hBMP);
end;

constructor TSpectrum.Create(Width, Height: Integer);
begin
{ TBitmap.Create для VisBuff }
VisBuff := LoadImage(hInstance, 'название картинки', IMAGE_BITMAP, 0, 0, 0);
VisBuffDC := CreateCompatibleDC(0);
SelectObject(VisBuffDC, VisBuff);
GetObject(VisBuff, sizeof(BITMAP), @BmpInfo);
CreateBitmap32(BmpInfo.bmWidth, BmpInfo.bmHeight);
BitBlt(BmpDC, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, VisBuffDC, 0, 0, SRCCOPY);
DeleteObject(VisBuff);
DeleteDC(VisBuffDC);


BackBmp:= TBitmap.Create;

VisBuff.Width:= Width;
VisBuff.Height:= Height;
BackBmp.Width:= Width;
BackBmp.Height:= Height;
BkColor:= clBlack;
SpecHeight:= 100;
PenColor:= clBlack;
PenMask:= clBlack;
PeakColor:= clWhite;
FPenSolid:= False;
DrawType:= 1;
DrawRes:= 1;
FrmClear:= True;
UseBkg:= False;
PeakFall:= 1;
LineFall:= 3;
ColWidth:= 3;
ShowPeak:= True;
end;

function _Rect(aLeft, aTop, aRight, aBottom: Integer): TRect;
begin
with Result do
begin
Left := aLeft;
Top := aTop;
Right := aRight;
Bottom := aBottom;
end;
end;

procedure TSpectrum.Draw(HWND: THandle; FFTData: TFFTData; X, Y: Integer);
var
I, J, YPos: LongInt;
YVal: Single;
R, G, B: Integer;
begin
if FrmClear then
begin
VisBuff.Canvas.Pen.Color:= BkColor;
VisBuff.Canvas.Brush.Color:= BkColor;
VisBuff.Canvas.Rectangle(0, 0, VisBuff.Width, VisBuff.Height);
if UseBkg then
VisBuff.Canvas.CopyRect(_Rect(0, 0, BackBmp.Width, BackBmp.Height),
BackBmp.Canvas, _Rect(0, 0, BackBmp.Width, BackBmp.Height));
end;
VisBuff.Canvas.Pen.Color:= PenColor;
for I:= 0 to 128 do
begin
YVal:= Abs(FFTData[(I * DrawRes) + 5]);
YPos:= Trunc((YVal) * 500);
if YPos > Height then YPos:= SpecHeight;
if YPos >= FFTPeacks[I] then
FFTPeacks[I]:= YPos
else
FFTPeacks[I]:= FFTPeacks[I] - PeakFall;
if YPos >= FFTFallOff[I] then
FFTFallOff[I]:= YPos
else
FFTFallOff[I]:= FFTFallOff[I] - LineFall;
if (VisBuff.Height - FFTPeacks[I]) > VisBuff.Height then FFTPeacks[I]:= 0;
if (VisBuff.Height - FFTFallOff[I]) > VisBuff.Height then FFTFallOff[I]:= 0;
case DrawType of
0:
begin
VisBuff.Canvas.MoveTo(X + I, Y + VisBuff.Height);
VisBuff.Canvas.LineTo(X + I, Y + VisBuff.Height - FFTFallOff[I]);
if ShowPeak then
VisBuff.Canvas.Pixels[X + I, Y + VisBuff.Height - FFTPeacks[I]]:= Pen;
end;
1:
begin
if ShowPeak then
begin
VisBuff.Canvas.Pen.Color:= PeakColor;
VisBuff.Canvas.MoveTo(X + I * (ColWidth + 1), Y + VisBuff.Height - FFTPeacks[I]);
VisBuff.Canvas.LineTo(X + I * (ColWidth + 1) + ColWidth, Y + VisBuff.Height - FFTPeacks[I]);
end;
if not FPenSolid then
begin
R:= GetRValue(GetLightColor(PenColor, GetRValue(PenMask)));
G:= GetGValue(GetLightColor(PenColor, GetGValue(PenMask)));
B:= GetBValue(GetLightColor(PenColor, GetBValue(PenMask)));
for J:= Y + VisBuff.Height - FFTFallOff[I] to Y + VisBuff.Height do
begin
if J > Height / 2 then
Dec(R, Trunc(256 / Height));
if J > Height / 2 then
Dec(G, Trunc(256 / Height));
if J > Height / 2 then
Dec(B, Trunc(256 / Height));
if R < 0 then R:= 0;
if G < 0 then G:= 0;
if B < 0 then B:= 0;
VisBuff.Canvas.Pen.Color:= TColor(RGB(R, G, B));
VisBuff.Canvas.Brush.Color:= TColor(RGB(R, G, B));
VisBuff.Canvas.Rectangle(X + I * (ColWidth + 1), J,
X + I * (ColWidth + 1) + ColWidth, J + 1);
end;
end else begin
VisBuff.Canvas.Pen.Color:= PenColor;
VisBuff.Canvas.Brush.Color:= PenColor;
VisBuff.Canvas.Rectangle(X + I * (ColWidth + 1), Y + VisBuff.Height -
FFTFallOff[I], X + I * (ColWidth + 1) + ColWidth, Y + VisBuff.Height);
end;
end;
end;
end;
BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, SRCCOPY);
end;

end.
[/more]

То есть например есть
VisBuff := TBitmap.Create;
И стал:

Код:
VisBuff := LoadImage(hInstance, 'название картинки', IMAGE_BITMAP, 0, 0, 0);
VisBuffDC := CreateCompatibleDC(0);
SelectObject(VisBuffDC, VisBuff);
GetObject(VisBuff, sizeof(BITMAP), @BmpInfo);
CreateBitmap32(BmpInfo.bmWidth, BmpInfo.bmHeight);
BitBlt(BmpDC, 0, 0, BmpInfo.bmWidth, BmpInfo.bmHeight, VisBuffDC, 0, 0, SRCCOPY);
DeleteObject(VisBuff);
DeleteDC(VisBuffDC);
Автор: Maks150988
Дата сообщения: 29.06.2008 09:19
Ну или никто если не знает, то вопрос. Есть такой код:


Код:
WM_PAINT :
begin
WndDC := BeginPaint(GetDlgItem(hApp, 1071), PS);
GetWindowRect(GetDlgItem(hApp, 1071), r2);
BASS_ChannelGetData(Stream, @fft, BASS_DATA_FFT1024);
Rectangle(WndDC, 0, 0, r2.right - r2.left, r2.bottom - r2.top);
for i := 1 to 256 do
begin
MoveToEx(WndDC, i, r2.bottom - r2.top, nil);
LineTo(WndDC, i, (r2.bottom - r2.top) - round(fft[i] * (r2.bottom - r2.top) * i));
end;
EndPaint(GetDlgItem(hApp, 1071), PS);
end;
Автор: nhdrthsruyy
Дата сообщения: 29.06.2008 13:54
ibquery1.SQL.Text:='Select*from XXX where ID='''+Edit1.Text+'''';

что означают плюсы и множество одинарных кавычек?
Автор: Jokerjar79
Дата сообщения: 29.06.2008 15:36
nhdrthsruyy, плюсы - это конкатинация (соединение) строк. Со множеством ковычек все просто, '' - это апостраф внутри строковой переменной, остальные - это начало/конец строки. То-есть, если Edit1.Text = 'Hello', то libquery1.SQL.Text примет вид Select*from XXX where ID='hello'
Автор: nhdrthsruyy
Дата сообщения: 29.06.2008 20:18
Jokerjar79
спасибо
Автор: ASE_DAG
Дата сообщения: 29.06.2008 22:07
Посоветуйте, пожалуйста.
Каким образом можно перехватить перемещение курсора Windows, при условии, что форма приложения не активна? Т.е. возникает ли какое-либо событие при перемещении курсора не над формой?

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Глобальные переменные в разных формах с++ builder 'a.


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