-
Недавно скачал KOL.Pas и сразу возник возможно глупый вопрос: Как преобразовать object в class? С Классами поудобней работать, а с объектами чёрт и что не получается нифига.
-
Тогда используйте VCL. KOL- Key Object Library - от классов специально отказались...
-
С Объектами я разобрался, теперь возник другой вопрос: В Кол Есть Аналог TCustomControl?
-
PControl?
-
Работай с классами, кто мешает? KOL не замена VCL, функционал KOL можно использовать в VCL (я opendirdialog постоянно так пользую).
-
Только при использовании VCL не спрашивай как размер уменьшить )
-
Попробовал наклипать компонент TImage при выходе из программы выдаётся ошибка: Invalid Pointer. type PImage = ^TImage; TImage = object(TControl) private FBitmap: PBitmap; procedure Paint(Sender: PControl; DC: HDC); public destructor Destroy; virtual; property Bitmap: PBitmap read FBitmap write FBitmap;
end;
function NewImage(AParent: PControl): PPOGiImage; implementation
destructor TImage.Destroy; begin FBitmap^.Free;
inherited; end; procedure TImage.Paint(Sender: PControl; DC: HDC); begin FBitmap^.Draw(DC,0,0); Canvas.Handle:= DC; end; function NewImage(AParent: PControl): PImage; begin Result:= PImage(NewPanel(AParent,esNone)); Result.FBitmap:= NewBitmap(0,0); Result.OnPaint:= Result.Paint;
end;
Нужно что-то в Destroy указать?
-
function NewImage(AParent: Pcontrol): Pimage; перед Implementation
-
2 CodeMasterА зачем колесо то изобретать 8) Есть визуальный MCK компонент PaintBox. Если MCK не используете, то создаете объект вречную: function NewPaintbox( AParent: PControl ): PControl; Посмотрите в KOL.PAS, там все написано. А еще почитайте KOLBook, скачать можно здесь: http://kolmck.net/docs/KOLBook.rar
-
> Попробовал наклипать компонент TImage при выходе из программы выдаётся ошибка: Invalid Pointer.У меня такого нету. Все нормально создается и уничтожается. А это: Canvas.Handle:= DC; зачем?
-
вот 100% рабочий код: type
PImage = ^TImage;
TImage = object(TControl)
private
fFileName : AnsiString;
FBitmap: PBitmap;
procedure Paint(Sender: PControl; DC: HDC);
public
destructor Destroy; virtual;
property Bitmap: PBitmap read FBitmap write FBitmap;
property FileName: AnsiString read fFileName write fFileName;
end;
function NewImage(AParent: PControl; FileName : AnsiString): PImage;
implementation
destructor TImage.Destroy;
begin
FBitmap^.Free;
inherited;
end;
procedure TImage.Paint(Sender: PControl; DC: HDC);
begin
FBitmap^.Draw(DC, 0, 0);
end;
function NewImage(AParent: PControl; FileName : AnsiString): PImage;
begin
Result:= PImage(NewPanel(AParent,esTransparent));
Result.Transparent := true;
Result.fFileName := FileName;
Result.FBitmap := NewBitmap(0,0);
Result.FBitmap.LoadFromFile(Result.fFileName);
Result.OnPaint:= Result.Paint;
end;
procedure TForm1.KOLFormFormCreate(Sender: PObj);
var
P : PImage;
begin
P := NewImage(Form, 'test.bmp');
end;
-
Хотя это ненужный код. Кидаете просто панель на форма и в OnPaint извращаетесь как угодно...
-
А то, что Вы пытались сделать делается так...если где напартачил, думаю Комрады подправят: type
PImage = ^TImage;
TImage = object(TControl)
private
fFileName : AnsiString;
FBitmap: PBitmap;
procedure Paint(Sender: PControl; DC: HDC);
public
destructor Destroy; virtual;
property Bitmap: PBitmap read FBitmap write FBitmap;
property FileName: AnsiString read fFileName write fFileName;
end;
function NewImage(AParent: PControl; FileName : AnsiString): PImage;
var
P : PImage;
implementation
destructor TImage.Destroy;
begin
FBitmap^.Free;
inherited;
end;
procedure TImage.Paint(Sender: PControl; DC: HDC);
begin
PImage(CustomObj)^.FBitmap^.Draw(DC, 0, 0);
end;
function NewImage(AParent: PControl; FileName : AnsiString): PImage;
var
D : PImage;
begin
Result := PImage(NewPanel(AParent, esNone));
New(D, Create);
Result.CustomObj := D;
D^.fFileName := FileName;
D^.FBitmap := NewBitmap(0, 0);
D^.FBitmap.LoadFromFile(D^.fFileName);
Result.SetSize(D^.FBitmap.Width, D^.FBitmap.Height);
Result.OnPaint := Result.Paint;
end;
procedure TForm1.KOLFormClose(Sender: PObj; var Accept: Boolean);
begin
P.Free;
end;
procedure TForm1.KOLFormFormCreate(Sender: PObj);
begin
P := NewImage(Applet, 'test.bmp');
end;
-
Это мой код dpr файла:
Applet := NewApplet('My Programm');
MyForm := NewForm(nil,'My Programm'); with MyForm^ do begin Width:= 100; Height:= 100; Left:= 100; Top:= 100; HasBorder:= True; end;
Image:= NewImage(POGiForm); Image.Bitmap.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Безымянный.bmp');
run(MyForm);
После закрытия главное формы издаётся звук об ошибке, но окно с ошибкой не вылазиет. Если запустить проект не через Delphi, то после закрытия формы вылетает окно с сообщением: 0x000000..... Память не может быть "read".
-
Мой последний код посмотрите...
-
MTsv DN (30.03.09 16:51) [12] Большое спасибо, больше вопросов пока не возникает.
-
На здоровье.
А книжку скачайте...не помещает. Не на все вопросы ответы есть, но на многие...
-
Заметил одну фишку, если форме назначить HasBorder = False то при нажатии правой кнопкой на приложении не вылетает контекстное окно. Как с этим бороться?: =)
-
*на приложении в панели задач*
-
если форме назначить HasBorder = False то при нажатии правой кнопкой на приложении не вылетает контекстное окно. Как с этим бороться? ---- не использовать HasBorder, а использовать SetWindowRegion
-
Полное описание функции SetWindowRegion можешь дать? А то у меня чёт компилятор ошибку выдаёт, грит такой функции не найдено.
-
MSDN
-
Заходил уже, всего 4 результата мне поиск показал и то чё то левое приведено в этих 4 статьях.
-
Vladimir Kladov может вы имели ввиду? SetWindowRgn
-
Если использовать RGN:= CreateRectRGN(10,10,100,100); SetWindowRgn(MyForm^.Handle,RGN, true);
Не работает: :(
-
> SetWindowRgn(MyForm^.Handle,RGN, true);
А MyForm^.Handle чему равен? не нулю случаем? MyForm^.Handle -> MyForm^.GetwindowHandle
> А то, что Вы пытались сделать делается так...если где напартачил, > думаю Комрады подправят:
:) Думаю еще проверку на наличие картинки нужно procedure TImage.Paint(Sender: PControl; DC: HDC); begin if not PImage(CustomObj)^.FBitmap^.Empty then PImage(CustomObj)^.FBitmap^.Draw(DC, 0, 0); end;
-
Оказывается чтобы убрать рамку нет ничего сложного, у формы нужно установить фляг 0
-
Хотя нет если выставить флаг стиля 0 исчезнет системное меню, прочитав MSDN я пришёл к такому выводу: MyForm^.Style:= WS_OVERLAPPED or WS_SYSMENU;
Работает ^)
|