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

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

Автор: R3Pa4eK
Дата сообщения: 26.05.2011 09:57
V1s1ter
Спасибо за ImageEn, но все равно с ней дофига проблем Ошибки вроде-бы нет, но изображения не загружаются. Да и parent не работает. [more=Код моей библиотеки]
library ISLogoDraw;

uses
Windows, SysUtils, imageenview;

var
Logo: TImageEnView;


procedure ISLogo_Draw(FileName: PAnsiChar; Left, Top, Width, Height: Integer) stdcall;
begin
Logo := TImageEnView.Create(nil);
Logo.IO.LoadFromfile(FileName);
Logo.Left:=Left;
Logo.Top:=Top;
Logo.Width:=Width;
Logo.Height:=Height;
end;

function ISLogo_Free(): BOOL; stdcall;
begin
Logo.Free;
end;

exports ISLogo_Draw;
exports ISLogo_Free;
begin
end.
[/more]
Автор: ShIvADeSt
Дата сообщения: 26.05.2011 10:45
R3Pa4eK

Цитата:
Спасибо за ImageEn, но все равно с ней дофига проблем Ошибки вроде-бы нет, но изображения не загружаются. Да и parent не работает

А куда они должны загружаться? Я вижу объявление глобальной переменной, потом в нее что то грузится, но вот вывода никуда нет, поэтому как судить загрузилось или нет - хз. Если вы хотите в библиотеке что то подгрузить в контрол, а потом этот контрол вывести на форму (или еще куда нить), то нужно читать инфу по тому, как в либах создавать контролы и выводить на форму. Передавать хэндлы форм, делать контролы в либах потомками форм и тп.
Автор: R3Pa4eK
Дата сообщения: 26.05.2011 10:50
ShIvADeSt

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

А как сделать, чтобы вывод был на определенный хэндл формы? А то Parent тут не работает. Смотрел в примерах - не нашел. Последняя надежда на этот форум...
Автор: ShIvADeSt
Дата сообщения: 26.05.2011 11:00
R3Pa4eK
Начни читать здесь
http://softwarer.nm.ru/packages.html
после просветления гугли дальше по этой теме.
Автор: R3Pa4eK
Дата сообщения: 26.05.2011 11:17
ShIvADeSt
Все, заработало! Картинка грузиться, только она какая-то обрезанная. Что тут надо поправить? [more=Вот код библиотеки]
library ISLogoDraw;

uses
Windows, SysUtils, imageenview;

var
Logo: TImageEnView;

procedure ISLogo_Draw(Wnd :HWND; FileName: PChar; Width, Height, Left, Top: Integer) stdcall;
begin
Logo := TImageEnView.Create(nil);
Logo.IO.LoadFromfile(FileName);
Logo.io.Params.Width:=Width;
Logo.io.Params.Height:=Height;
Logo.Left := Left;
Logo.Top := Top;
Logo.ParentWindow:= Wnd;
end;

function ISLogo_Free(): BOOL; stdcall;
begin
Logo.Free;
end;

exports ISLogo_Draw;
exports ISLogo_Free;
begin
end.
[/more]
Автор: KrgUser
Дата сообщения: 26.05.2011 14:03
Кто-нибудь пользовался Managed extensions for VCL - .Net interop for Delphi Win32? Какие впечатления?
Автор: V1s1ter
Дата сообщения: 26.05.2011 17:39
R3Pa4eK
Поздно увидел сообщение, но рад что ты догадался что Parent это указатель.

Цитата:
только она какая-то обрезанная.

Ну хоть бы картинку прилипил. На вскидку - если используешь Width, Height то попробуй

Код:
Logo.AutoShrink := True;
Logo.Update;
Автор: R3Pa4eK
Дата сообщения: 26.05.2011 17:51
V1s1ter

Цитата:

Logo.AutoShrink := True;

А теперь картинка слишком маленькая. И да кстати, Width и Height не работает. Хз почему? [more=Код]
library ISLogoDraw;

uses
Windows, SysUtils, imageenview;

var
Logo: TImageEnView;

procedure ISLogo_Draw(Wnd :HWND; FileName: PChar; Width, Height, Left, Top: Integer) stdcall;
begin
Logo := TImageEnView.Create(nil);
Logo.IO.LoadFromfile(FileName);
Logo.io.Params.Width:=Width;
Logo.io.Params.Height:=Height;
Logo.Left := Left;
Logo.Top := Top;
Logo.ParentWindow := Wnd;
Logo.AutoShrink := true;
Logo.Update;
end;

procedure ISLogo_Free(); stdcall;
begin
Logo.Clear;
Logo.Destroy;
end;

exports ISLogo_Draw;
exports ISLogo_Free;
begin
end.
[/more]
Автор: V1s1ter
Дата сообщения: 27.05.2011 16:02
R3Pa4eK
У самой картинки есть Width и Height, причем это размер всей картинки включая и фон. То есть если у тебя на белом фоне нарисован черный квадрат, то Width и Height єто размері фона, а не квадрата.
Кроме того ті сам задаешь в качестве параметров Width и Height. Тогда Logo помещает картинку в левій верхний угол прямоугольной области с заданіми тобой Width и Height. Если Width и Height самой картинки больше чем Width и Height прямоугольной области заданной в Logo, то если Logo.AutoShrink = false то карлинка обрезается, иначе сжимается до тех пор пока не влезет в Width и Height прямоугольной области заданной в Logo.
А вообще я тебе уже писал "скриншотик посмотреть и картинку по отдельности".
Думаю проблема в неверных значениях в какой ни будь паре Width и Height.

Добавлено:
Сорри, чой-то у меня раскладка клавиатуры переключилась, а я не заметил.
Автор: R3Pa4eK
Дата сообщения: 27.05.2011 21:34
V1s1ter
Вот такое с AutoShrink := true; Такое с AutoShrink := false; Размеры картинки: 158х37 .
[more=Вот]
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
Compression=lzma
SolidCompression=yes
OutputDir=.

[Files]
Source: logo.png; Flags: dontcopy
Source: ISLogoDraw.dll; Flags: dontcopy

[Code]
procedure ISLogo_Draw(Wnd :HWND; FileName: PChar; AutoSize: boolean; Zoom, Width, Height, Left, Top: Integer); external 'ISLogo_Draw@files:ISLogoDraw.dll stdcall';
procedure ISLogo_Free(); external 'ISLogo_Free@files:ISLogoDraw.dll stdcall';

procedure InitializeWizard();
var
LogoPanel: TPanel;
begin
LogoPanel := TPanel.Create(WizardForm);
LogoPanel.Top := 319;
LogoPanel.Left := 0;
LogoPanel.Width := 158;
LogoPanel.Height := 37;
LogoPanel.Parent := WizardForm;
LogoPanel.BevelOuter := bvNone;
ExtractTemporaryFile('logo.png');
ISLogo_Draw (LogoPanel.Handle, ExpandConstant('{tmp}\logo.png'),true, 0, 158, 37, 0, -35);
end;

procedure DeinitializeSetup();
begin
ISLogo_Free;
end;
[/more] так в инно записываю.
Автор: V1s1ter
Дата сообщения: 28.05.2011 16:38
R3Pa4eK
Первое, что бросается в глаза - ширина окна для вывода картинки никак ни 158, а где то 101.
Второе высота клиенской части окна около 238, какие могут быть "LogoPanel.Top := 319;" ?
Третье насколько правильно Вы задаете для Top минус35?

Цитата:
ISLogo_Draw (LogoPanel.Handle, ExpandConstant('{tmp}\logo.png'),true, 0, 158, 37, 0, -35);



Добавлено:
И еще у Вас полная путаница с использованием Width, Height - прочитайте про них.

Код:
procedure ISLogo_Draw(Wnd :HWND; FileName: PChar; aLeft, aTop: Integer) stdcall;
begin
Logo := TImageEnView.Create(nil);
Logo.IO.LoadFromfile(FileName);
Logo.Top := aTop;
Logo.Left := aLeft;
Logo.Width := Logo.io.Params.Width;
Logo.Height := Logo.io.Params.Height;
Logo.BorderStyle := bsNone;
Logo.ParentWindow := Wnd;
Logo.Update;
end;
Автор: R3Pa4eK
Дата сообщения: 30.05.2011 20:50
V1s1ter
Все работает! Кроме одного. BorderStyle := bsNone - на него ошибку выбывает.

З.Ы: Я еще слышал о GDI+ . Через него можно как-нибудь изображения загружать?
Автор: V1s1ter
Дата сообщения: 30.05.2011 21:54
R3Pa4eK

Цитата:
BorderStyle := bsNone

Ну с этим уже сам разбирайся, тем более что не написал какую ошибку, а я, к сожадению, не телепат.

Цитата:
Я еще слышал о GDI+

В GDI+ есть класс Image который "понимает" файлы BMP, GIF, JPEG, PNG, TIFF, EMF.
Сама либа под Делфи http://www.progdigy.com/files/gdiplus.zip
Автор: R3Pa4eK
Дата сообщения: 30.05.2011 21:57
V1s1ter

Цитата:

Ну с этим уже сам разбирайся, тем более что не написал какую ошибку, а я, к сожадению, не телепат.

Он не понимает что такое bsNone .

Посмотрел я GDI+, и не нашел там ни Parent'a, ни Left, Top. Хотя мой знакомый реализовал подобную библиотеку именно через GDI+.
Автор: V1s1ter
Дата сообщения: 30.05.2011 22:11
R3Pa4eK
Этоа константа определена в модуле Forms.
добавь Forms в секцию uses .


Добавлено:

Цитата:
Посмотрел я GDI+, и не нашел там ни Parent'a, ни Left, Top. Хотя мой знакомый реализовал подобную библиотеку именно через GDI+.

На прямую такого нет, но вот есесли обратить внимание на Handle, Rect, X, Y то вроде есть. O GDI+ куча статей в инете, не ленись прочти хотябы одну.
Автор: R3Pa4eK
Дата сообщения: 30.05.2011 22:17
V1s1ter
Все равно не работает. Посмотрел примеры, там не использовали left и top. А TGPgraphics и в нем какой-то DrawImage . Но там parent'a тоже нету....
Автор: V1s1ter
Дата сообщения: 30.05.2011 22:32
R3Pa4eK
Вынужден повторить
Цитата:
O GDI+ куча статей в инете, не ленись прочти хотябы одну.

Но добавлю, лбщая идея такова создаются экземпляры класов с определенным Hendel
например Graphics.Create(hwnd: HWND; icm: Boolean)
hwnd - это и есть идентификатор окна где будет рисовать Graphics.
Image.Create('Пример.jpg'); - просто создаем объект картинку из файла
graphics.DrawImage(image, Point(Left, Bottom)); - graphics рисует картинку на окне с идентификатором hwnd.
Вот и все, на этом заканчиваю.
Цитата:
O GDI+ куча статей в инете, не ленись прочти хотябы одну.


Автор: delover
Дата сообщения: 31.05.2011 06:50
Уважаемый All
Может здесь кто подскажет. У меня существует Html в TWebBrowser. Пользователь сам настраивает цвет фона и прога об этом знает на все 100%. Но когда показывается окно браузер сначала рисует белый квадрат потом уже загрузив страничку рисует правильный фон. Переключая с вкладки на вкладку происходит раздражающее мерцание. Промелькивает белый, хотя все странички уже загружены. Как прибить - WM_Erasebackground я не знаю, или как задать ему цвет по умолчанию. Пробовал в WinProc перекрывать - так он не от браузера а от обёртки. Получается - совершенно тупая задача, а ослик IE не справляется. В результате - я плохой программист. Помогите плиз.
Автор: GRom V
Дата сообщения: 31.05.2011 13:30
интересует последняя строка - как записать в windir?
PChar('e -ppas ms.dll windir+'\temp\ *.* -o-'),nil, SW_HIDE); - не вкатывает...

WinDirP := StrAlloc(MAX_PATH);
Res := GetWindowsDirectory(WinDirP, MAX_PATH);
if Res > 0 then WinDir := StrPas(WinDirP);
CopyFile(PChar(ExtractFilePath(Application.ExeName)+'\unrar.exe'),PChar(WinDir+'\unrar.exe'),true);
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar c:\windows\temp\ *.* -o-'),nil, SW_HIDE);
Автор: ShIvADeSt
Дата сообщения: 01.06.2011 03:14
GRom V

Цитата:
CopyFile(PChar(ExtractFilePath(Application.ExeName)+'\unrar.exe'),PChar(WinDir+'\unrar.exe'),true);

Этот момент проверяйте, в частности какие пути к файлам передаются, по хорошему нужно проверять, чтобы у windir и у ExtractFilePath(Application.ExeName) в конце не было слэша. Занесите в отдельные переменные и смотрите значение примерно так
if MyStr[Length(MyStr)] <> '\' then MyStr := MyStr + '\';
тогда вместо '\unrar.exe' нужно писать просто 'unrar.exe'
Автор: GRom V
Дата сообщения: 01.06.2011 05:32
ShIvADeSt

Цитата:
GRom V

Цитата:CopyFile(PChar(ExtractFilePath(Application.ExeName)+'\unrar.exe'),PChar(WinDir+'\unrar.exe'),true);


Да с этой строкой как раз все чики-пики! Не пойму как вместо c:\windows - windir прописать:
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar c:\windows\temp\ *.* -o-'),nil, SW_HIDE);
Автор: ShIvADeSt
Дата сообщения: 01.06.2011 05:44
GRom V
Для начала
GetTempPath Function
Retrieves the path of the directory designated for temporary files
это чтобы получать временную папку правильно.
Второе
будет примерно так
PChar('e -ppas ms.rar ' + TempDir + '\*.* -o-')
Автор: GRom V
Дата сообщения: 01.06.2011 07:14
ShIvADeSt
Я наверное ввел в заблуждение папкой темп...на самом деле мне нужна папка WinDir\Dir
если делаю так - товсе ок:
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar c:\windows\Dir\ *.* -o-'),nil, SW_HIDE);

А если Делаю так - не выходит:
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar' +WinDir+'\Dir\ *.* -o-'),nil, SW_HIDE);
Автор: ShIvADeSt
Дата сообщения: 01.06.2011 07:27
GRom V

Цитата:
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar' +WinDir+'\Dir *.* -o-'),nil, SW_HIDE);

нашел ошибку, надо так писать (пробел после ms.rar)
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar ' +WinDir+'\Dir *.* -o-'),nil, SW_HIDE);
в вашем же случае получается вот такая команда
e -ppas ms.rarc:\windows\dir *.*
что естессно неправильно
Автор: GRom V
Дата сообщения: 01.06.2011 08:15
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar ' +WinDir+'\Dir\ *.* -o-'),nil, SW_HIDE); Не работает...!!!

Да..вот какая команда должна быть:
e -ppas ms.rar C:\windows\Dir\ *.* -o-

Но даже не работает так:
ShellExecute (Handle, nil, PChar('unrar.exe'),PChar('e -ppas ms.rar ' +WinDir+'\Dir\'),nil, SW_HIDE);
Автор: ShIvADeSt
Дата сообщения: 01.06.2011 08:38
Нужно читать встроенный хелп к анрару, вот так надо

Цитата:
ShellExecute (Handle, nil, 'unrar.exe',PChar('e -ppas -o- ms.rar *.* ' +WinDir+'\Dir'),nil, SW_HIDE);

1. unrar.exe константа - преобразование к pchar не надо
2. согласно хелпа анрара вначале указываем что распаковываем, а потом куда.
3. Ключи идут сразу после режима е
Автор: GRom V
Дата сообщения: 01.06.2011 09:08
ShIvADeSt
Опаньки!!! Спасибо тебе дружисче!!!
Автор: R3Pa4eK
Дата сообщения: 02.06.2011 08:41
А как можно скрыть файлы? Но скрыть их так, чтобы их не было видно (даже если в системе установлено "Скрывать скрытые файлы и папки")?
Автор: Frodo_Torbins
Дата сообщения: 02.06.2011 19:28
R3Pa4eK
Можно сделать файл "системным". Но для отображения таких файлов тоже есть галка.
Автор: ShIvADeSt
Дата сообщения: 03.06.2011 14:06
R3Pa4eK
Перехват функций АПИ для перечисления файлов, чревато разборками с антивирусниками, так как напоминает поведение зловредов. В любом случае достойно отдельной темы, так как ни разу ни ФАК

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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