Vericando a posição de uma Timage em runtime

Delphi

18/08/2015

Boa tarde Pessoal

Estou com uma duvida boba na hora de criar o tImage em tempo de execução.

Exemplo
var
imagem1, imagem2 : TImage;
begin
Imagem1:= timage.create(self);
imagem1.parent := form_principal;
imagem1.top := 5;
imagem1.Left := 5;
imagem1.Width := 80;
imagem1.Height := 80;
imagem1.Picture.LoadFromFile('caminho da imagem');

minha duvida é na criação da outra tImage....

como eu faço para verificar se ja tem um Timage na posição.

pq eu to falando isso... se eu não fazer essa verificação ele vai criar as Timages só que vai ficar uma em cima da outra....

segue abaixo um exemplo bobo do meu raciocinio

if not ((Timage.left = 5) and(Timage.top = 5)) then
begin
// eu criou o novo Timage nesta posição
end
else
// crio em outra posição

fico agradecido pela ajuda do forum e dos colaboradores.
Rafael Panizza

Rafael Panizza

Curtidas 0

Melhor post

Mateus Ribeiro

Mateus Ribeiro

18/08/2015

Boa tarde!

É simples, vc verifica todos os componentes do seu formulário e verifica se os TImage estão nessa posição. Basicamente é isso:

var i: integer;
begin

  for i:= 0 to ComponentCount - 1 do
    if (Components[i].ClassType = TImage) then
      if (TImage(Components[i]).Top = 5) and (TImage(Components[i]).Left = 5) then
        ShowMessage('Já existe um TImage nessa posição');


Vc pode criar uma função em cima desse code, boa sorte ^^
GOSTEI 1

Mais Respostas

Rafael Panizza

Rafael Panizza

18/08/2015

Boa tarde Mateus

obrigado pela agilidade e a eficiencia em responder o post

irei testar aqui e te responde se deu certo

grato
GOSTEI 0
Rafael Panizza

Rafael Panizza

18/08/2015

Olá boa noite

Tentei usar o seu método e funcionou em partes...
por exemplo, quando eu faço a verificação pra saber se tem um Timage no top = 5 e left = 5... da certo, se não tem blz... eu crio o meu timage....
agora o problema é quando ja tem a timage no top = 5 e left = 5... ai eu tenho que criar a imagem em outro lugar e para isso eu tenho que fazer novamente a verificação, e nessa parte que está dando errado... veja o codigo que eu fiz abaixo

var i: integer;
begin
if atendimento.Caption ='ok' then
for i:= 0 to ComponentCount - 1 do
if (Components[i].ClassType = TImage) then
if not(TImage(Components[i]).Top = 5) and not(TImage(Components[i]).Left = 5) then
begin
ShowMessage('pode criar a imagem na primeira posição');
end
else
if not(TImage(Components[i]).Top = 5) and not(TImage(Components[i]).Left = 125) then
begin
ShowMessage('pode criar a imagem na segunda posição');
end
else
if not(TImage(Components[i]).Top = 5) and not(TImage(Components[i]).Left = 195) then
begin
ShowMessage('pode criar a imagem na terceira posição');
end;
// e assim por diante até ter um espaço vazio
end;

o que eu estou fazendo errado?

fico no aguardo
GOSTEI 0
Rafael Panizza

Rafael Panizza

18/08/2015

Boa tarde Mateus

obrigado pela agilidade e a eficiencia em responder o post

irei testar aqui e te responde se deu certo

grato
Olá boa noite

Tentei usar o seu método e funcionou em partes...
por exemplo, quando eu faço a verificação pra saber se tem um Timage no top = 5 e left = 5... da certo, se não tem blz... eu crio o meu timage....
agora o problema é quando ja tem a timage no top = 5 e left = 5... ai eu tenho que criar a imagem em outro lugar e para isso eu tenho que fazer novamente a verificação, e nessa parte que está dando errado... veja o codigo que eu fiz abaixo

var i: integer;
begin
if atendimento.Caption ='ok' then
for i:= 0 to ComponentCount - 1 do
if (Components[i].ClassType = TImage) then
if not(TImage(Components[i]).Top = 5) and not(TImage(Components[i]).Left = 5) then
begin
ShowMessage('pode criar a imagem na primeira posição');
end
else
if not(TImage(Components[i]).Top = 5) and not(TImage(Components[i]).Left = 125) then
begin
ShowMessage('pode criar a imagem na segunda posição');
end
else
if not(TImage(Components[i]).Top = 5) and not(TImage(Components[i]).Left = 195) then
begin
ShowMessage('pode criar a imagem na terceira posição');
end;
// e assim por diante até ter um espaço vazio
end;

o que eu estou fazendo errado?

fico no aguardo
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

18/08/2015

Bom dia!

Criei aqui um método que merece ser visto, fiz de uma maneira que ele vai criando um TImage do lado do outro.
Segue:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Jpeg;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure CriarImage(DirImagem: String; Top, Left, Heigth, Width: Integer);
    function ExisteImage(mTop, mLeft: Integer): Boolean;
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  Form1: TForm1;
  xTop: Integer = 1;
  xLeft: Integer = 1;
  xHeigth: Integer = 105;
  xWidth: Integer = 105;

implementation

{$R *.dfm}

procedure TForm1.CriarImage(DirImagem: String; Top, Left, Heigth, Width: Integer);
var Imagem: TImage;
begin
  Imagem:= TImage.Create(Self);
  Imagem.Parent:= Form1;

  Imagem.Top:= Top;
  Imagem.Left:= Left;
  Imagem.Height:= Heigth;
  Imagem.Width:= Width;
  Imagem.Picture.LoadFromFile(DirImagem);
end;

function TForm1.ExisteImage(mTop, mLeft: Integer): Boolean;
var i: integer;
begin

  Result:= False;
  for i:= 0 to ComponentCount - 1 do
    if (Components[i].ClassType = TImage) then
      if (TImage(Components[i]).Top = mTop) and (TImage(Components[i]).Left = mLeft) then
        Result:= True;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  if ExisteImage(xTop, xLeft) then
    begin
      xLeft:= xLeft + xWidth + 2;
      CriarImage('SUA IMAGEM AQUI', xTop, xLeft, xHeigth, xWidth);
    end
  else
    CriarImage('SUA IMAGEM AQUI', xTop, xLeft, xHeigth, xWidth);

end;

end.

GOSTEI 1
Rafael Panizza

Rafael Panizza

18/08/2015

Boa tarde Mateus

mais uma vez obrigado pela atenção

vou testar aqui e te falo se deu certo
GOSTEI 0
Rafael Panizza

Rafael Panizza

18/08/2015

Boa noite Mateus

Parabens pelo conhecimento e obrigado por me ajudar, problema resolvido...

Fiz uma modificação de acordo com a minha necessidade, ao inves de usar o (if then) eu usei o (white do) assim ele faz o loop e verifica espaço por espaço até achar uma vazia...

segue o codigo para compartilhar com os demais.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Jpeg, Vcl.Imaging.pngimage;

type
TForm1 = class(TForm)
btn1: TButton;
atendimento: TLabel;
gerenciamento: TLabel;
configuracao: TLabel;
compras: TLabel;
function ExisteTimage(mTop, mLeft: Integer): Boolean;
procedure CriarImage(caminhoImagem: String; imagemLeft: Integer);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
imagem : TImage;
imagemLeft : Integer;
caminhoImagem : string;
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
if atendimento.Caption = 'ATIVO' then
begin
caminhoImagem := 'caminho da imagem';
imagemLeft := 5;
while ExisteTimage(5, imagemLeft) do
begin
imagemLeft := imagemLeft + 75;
end;
if not ExisteTimage(5, imagemLeft) then
begin
CriarImage(caminhoImagem, imagemLeft);
end;
end;
if gerenciamento.Caption = 'ATIVO' then
begin
caminhoImagem := 'caminho da imagem';
imagemLeft := 5;
while ExisteTimage(5, imagemLeft) do
begin
imagemLeft := imagemLeft + 75;
end;
if not ExisteTimage(5, imagemLeft) then
begin
CriarImage(caminhoImagem, imagemLeft)
end;
end;
if configuracao.Caption = 'ATIVO' then
begin
caminhoImagem := 'caminho da imagem';
imagemLeft := 5;
while ExisteTimage(5, imagemLeft) do
begin
imagemLeft := imagemLeft + 75;
end;
if not ExisteTimage(5, imagemLeft) then
begin
CriarImage(caminhoImagem, imagemLeft);
end;
end;
if compras.Caption = 'ATIVO' then // como se fosse um modulo
begin
caminhoImagem := 'caminho da imagem';
imagemLeft := 5;
while ExisteTimage(5, imagemLeft) do
begin
imagemLeft := imagemLeft + 75;
end;
if not ExisteTimage(5, imagemLeft) then
begin
CriarImage(caminhoImagem, imagemLeft);
end;
end;
end;

procedure TForm1.CriarImage(caminhoImagem: String; imagemLeft: Integer);
begin
Imagem:= TImage.Create(Self);
Imagem.Parent:= Form1;
Imagem.Top:= 5;
Imagem.Left:= imagemLeft;
Imagem.Height:= 81;
Imagem.Width:= 65;
Imagem.Picture.LoadFromFile(caminhoImagem);
end;

function TForm1.ExisteTimage(mTop, mLeft: Integer): Boolean;
var i: integer;
begin
Result:= False;
for i:= 0 to ComponentCount - 1 do
if (Components[i].ClassType = TImage) then
if (TImage(Components[i]).Top = mTop) and (TImage(Components[i]).Left = mLeft) then
Result:= True;
end;
end.
GOSTEI 0
Mateus Ribeiro

Mateus Ribeiro

18/08/2015

Bom dia!

Que bom que deu certo... Boa sorte amigo ^^
GOSTEI 1
Rafael Panizza

Rafael Panizza

18/08/2015

Obrigado (:
GOSTEI 0
POSTAR