Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Pasar pequeño codigo Delphi a Builder

Hola amigos, quería meter un TImage dentro de un ScrollBox y entonces pongo la TImage en Autosize y cuando la imagen es mayor que el ScrollBox pues salen las barras de desplazamiento y hasta ahi bien. Pues ahora lo que quiero es que pueda hacer clic en la imagen y sin soltar arrastre la imagen y se desplacen las barras del scrollbox y no tengo ni idea de como hacerlo pero encontre este codigo en Delphi: h**p://delphi.about.com/od/vclusing/l/aa050603a.htm
Creo que por lo que entiendo en el texto hace lo que quiero pero no se como pasarlo a C++Builder y he intentado con esto pero no compila siquiera:

UNIT1.H
Código:
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TScrollBox *ScrollBox1;
        TImage *Image1;
        void __fastcall Image1MouseDown(TObject *Sender,
          TMouseButton Button, TShiftState Shift, int X, int Y);
        void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
        void __fastcall MyDragDrop(TObject *Sender, TObject *Source, int X, int Y);
        void __fastcall MyDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept);
public:        // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
TPoint *TheSpot;
//---------------------------------------------------------------------------
#endif
UNIT1.CPP
Código:
//-----------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//-----------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//-----------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//-----------------------------------------------------------------------------

void __fastcall MyDragDrop(TObject *Sender, TObject *Source, int X, int Y)
{
        //dropping an Image?
        if(Source == TImage)
        {
                //on itself?
                if(Sender == TImage)
                {
                        TImage(Source)->Left = TImage(Source)->Left + X - TheSpot->x;
                        TImage(Source)->Top = TImage(Source)->Top + Y - TheSpot->y;
                }
                else
                {
                        //or, somewhere inside ScrollBox!
                        TImage(Source)->Left = X - TheSpot->x;
                        TImage(Source)->Top = Y - TheSpot->y;
                }
        }
}
//-----------------------------------------------------------------------------

void __fastcall MyDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool Accept)
{
        if(Source == TImage)
                Accept = true;
        Accept = (Source is TImage);
}
//-----------------------------------------------------------------------------

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        TheSpot->x = X;
        TheSpot->y = Y;

        Image1->BeginDrag(true);
}
//-----------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
        Image1->OnDragOver = MyDragOver;
        Image1->OnDragDrop = MyDragDrop;
}
//-----------------------------------------------------------------------------
¿Podeis ayudarme a pasarlo al builder?
Responder Con Cita
  #2  
Antiguo 02-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Lo siento por el enlace, no tengo nada que ver con esa web, es simplemente para que podais ver de donde saqué el código original y podais ayudarme.
Se me olvidó decir los errores que me muestra con lo que hice:

Build
[C++ Error] Unit1.cpp(21): E2108 Improper use of typedef 'TImage'
[C++ Error] Unit1.cpp(24): E2108 Improper use of typedef 'TImage'
[C++ Error] Unit1.cpp(26): E2285 Could not find a match for 'TImage::TImage(TObject *)'
[C++ Error] Unit1.cpp(26): E2459 VCL style classes must be constructed using operator new
[C++ Error] Unit1.cpp(26): E2285 Could not find a match for 'TImage::TImage(TObject *)'
[C++ Error] Unit1.cpp(26): E2459 VCL style classes must be constructed using operator new
[C++ Error] Unit1.cpp(27): E2285 Could not find a match for 'TImage::TImage(TObject *)'
[C++ Error] Unit1.cpp(27): E2459 VCL style classes must be constructed using operator new
[C++ Error] Unit1.cpp(27): E2285 Could not find a match for 'TImage::TImage(TObject *)'
[C++ Error] Unit1.cpp(27): E2459 VCL style classes must be constructed using operator new
[C++ Error] Unit1.cpp(32): E2285 Could not find a match for 'TImage::TImage(TObject *)'
[C++ Error] Unit1.cpp(32): E2459 VCL style classes must be constructed using operator new
[C++ Error] Unit1.cpp(33): E2285 Could not find a match for 'TImage::TImage(TObject *)'
[C++ Error] Unit1.cpp(33): E2459 VCL style classes must be constructed using operator new
[C++ Error] Unit1.cpp(41): E2108 Improper use of typedef 'TImage'
[C++ Error] Unit1.cpp(43): E2293 ) expected
Responder Con Cita
  #3  
Antiguo 02-06-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola aguml.

Según creo entender de tu mensaje, el movimiento de la imágen debe producirse dentro de los límites del TScrollBox.

Entonces, si interpreté bién, podes hacer:
Código:
TPoint PIni;

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  if (Shift.Contains(ssCtrl)) { /* ¿ Tecla Ctrl presionada ? */
    PIni.x = X;
    PIni.y = Y;
    Image1->BeginDrag(true);
  }
}

void __fastcall TForm1::ScrollBox1DragOver(TObject *Sender,
      TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
  Accept = Source->ClassNameIs("TImage");
}

void __fastcall TForm1::ScrollBox1DragDrop(TObject *Sender,
      TObject *Source, int X, int Y)
{
  Image1->Left = X - PIni.x;
  Image1->Top  = Y - PIni.y;
}
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 02-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Eso que pones no me funciona. Si pulso Ctrol y hago clic sobre la imagen me aparece el cursor de prohibido y no deja arrastrar la imagen. En el texto que yo puse creo que explicaba algo para evitar eso porque creo que lo que hay que hacer es mover la imagen pero lo que pasa es que al hacer clic se hace clic sobre el scrollbox y no sobre el TImage. Creo que decia algo asi. Lo ideal seria convertir el codigo que puse que está en una especie de tutorial o algo asi y se supone que funcionará sin problemas.
Responder Con Cita
  #5  
Antiguo 02-06-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Ese código si funciona, te lo aseguro.

El ícono de prohibido lo vas a ver siempre que el cursor del mouse esté sobre la imágen ya que este componente no tiene por qué permitir ningún drop dentro de él. Seguí desplazándote hasta posicionarte en el área del ScrollBox y me contas.

De todos modos, estaba pensando que si tenes mas de una imágen dentro del ScrollBox, seguramente te sea mas útil de este modo:
Código:
TPoint PIni;

void __fastcall TForm1::Image1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
 if (Shift.Contains(ssCtrl)) { /* ¿ Tecla Ctrl presionada ? */
    PIni.x = X;
    PIni.y = Y;
    ((TImage*)Sender)->BeginDrag(true);
  }
}


void __fastcall TForm1::ScrollBox1DragOver(TObject *Sender,
      TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
  Accept = Source->ClassNameIs("TImage");
}

void __fastcall TForm1::ScrollBox1DragDrop(TObject *Sender,
      TObject *Source, int X, int Y)
{
  ((TImage*)Source)->Left = X - PIni.x;
  ((TImage*)Source)->Top  = Y - PIni.y;
}
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 03-06-2013 a las 01:32:09.
Responder Con Cita
  #6  
Antiguo 03-06-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Se me ocurre otra forma de mover las imágenes dentro del ScrollBox. Pero no utilizando los eventos OnDragOver y OnDragDrop como en el código de tu primer mensaje. Por medio de aquellos, veo difícil solucionar el efecto del ícono de prohibición.

Tal vez esta propuesta se ajuste mas a lo que estas buscando:
Código:
bool Moving;

void __fastcall TForm1::ControlMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  Moving = Shift.Contains(ssCtrl);
}


void __fastcall TForm1::ControlMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  TControl *Ctrl = static_cast<TControl*>(Sender);

  if (Moving) {
    Ctrl->Left = X + Ctrl->Left;
    Ctrl->Top  = Y + Ctrl->Top;
  }
}

void __fastcall TForm1::ControlMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  Moving = false;
}
Asigna los eventos al/los controles que desees mover (Images en tu caso).

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 03-06-2013 a las 05:27:25.
Responder Con Cita
  #7  
Antiguo 03-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Pues no se que pasa que ninguno de los que me has puesto me funciona a mi. Hay una imagen en el TImage, pulso Ctrol., hago clic sobre la imagen e intento arrastrar para que se muevan los scrolls y poder ir mostrando el resto de la imagen pero no hace absolutamente nada, solo sale el icono de prohibido y nada mas.
Responder Con Cita
  #8  
Antiguo 03-06-2013
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Te adjunto el código fuente que te sugerí en el mensaje #6 para que puedas estudiarlo con tranquilidad. (Compila y funciona correctamente en C++ Builder 6)

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 05-06-2013 a las 17:16:08.
Responder Con Cita
  #9  
Antiguo 03-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Guauuuuu, tio no se que haria yo mal, quizas es que activas alguna propiedad o algo pero tu proyecto va muy bien y solo le hice un par de cambios para que funcione mas o menos como quiero porque por ejemplo en el tuyo cuando mueves automaticamente el puntero se va a la posicion x=0, y=0 de la imagen y le quité lo de que tenga que pulsar la tecla de Ctrol y va genia pero me falta un detalle:

Código:
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TPoint *TheSpot = new TPoint;

__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}

bool Moving = false;

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  Image1->Picture->LoadFromFile(ExtractFilePath(Application->ExeName)+
    "LogoRad.bmp");
}

void __fastcall TForm1::ControlMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
  //Moving = Shift.Contains(ssCtrl);
  Moving = true;
  TheSpot->x = X;
  TheSpot->y = Y;
}


void __fastcall TForm1::ControlMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
  TControl *Ctrl = static_cast<TControl*>(Sender);

  if (Moving) {
    Screen->Cursor = crCross;
    Ctrl->Left = X + Ctrl->Left - TheSpot->x;
    Ctrl->Top  = Y + Ctrl->Top - TheSpot->y;
  }
}

void __fastcall TForm1::ControlMouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  Moving = false;
  Screen->Cursor = crDefault;
}
Quiero que cuando arrastres la imagen y llegues al final de la imagen por cualquiera de sus lados ya no pueda desplazarse mas, o sea, que puedas arrastrar hasta que por ejemplo la parte superior de la imagen llegue a la parte superior del scrollbox y lo mismo por cualquiera de sus lados, no se si me explico. Tiene que ser super facil pero no veo la forma.
Responder Con Cita
  #10  
Antiguo 03-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
He probado esto:
Código:
if((Ctrl->Left + X + Ctrl->Left - TheSpot->x < 0) || (Ctrl->Left < 0 && Ctrl->Width + Ctrl->Left - ScrollBox1->Width >= 0))
{
       Ctrl->Left = X + Ctrl->Left - TheSpot->x;
}
Pero no funciona bien, solo para impedir pasarnos por la izquierda pero por la derecha no. ¿como puede ser? Tengo un mareo ya con tanto left, width, x, ... jajaja.
Responder Con Cita
  #11  
Antiguo 03-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Al final lo he conseguido con esto:

Código:
void __fastcall TForm1::ControlMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
        TControl *Ctrl = static_cast<TControl*>(Sender);

        if (Moving)
        {
                if((Ctrl->Left + X + Ctrl->Left - TheSpot->x <= 0) &&
                   (Ctrl->Width + Ctrl->Left + X + Ctrl->Left -  TheSpot->x - ScrollBox1->Width >= 0) &&
                   (Ctrl->Top + Y + Ctrl->Top - TheSpot->y <= 0) &&
                   (Ctrl->Height + Ctrl->Top + Y + Ctrl->Top - TheSpot->y - ScrollBox1->Height >= 0))
                {
                        Ctrl->Left = X + Ctrl->Left - TheSpot->x;
                        Ctrl->Top  = Y + Ctrl->Top - TheSpot->y;
                }
                else if((Ctrl->Left + X + Ctrl->Left - TheSpot->x <= 0) &&
                   (Ctrl->Width + Ctrl->Left + X + Ctrl->Left - TheSpot->x - ScrollBox1->Width >= 0))
                {
                        Ctrl->Left = X + Ctrl->Left - TheSpot->x;
                }
                else if((Ctrl->Top + Y + Ctrl->Top - TheSpot->y <= 0) &&
                   (Ctrl->Height + Ctrl->Top + Y + Ctrl->Top - TheSpot->y - ScrollBox1->Height >= 0))
                {
                        Ctrl->Top  = Y + Ctrl->Top - TheSpot->y;
                }
        }
}
Solo veo un problema y es que cuando lo empiezo a arrastrar sin soltar y arrastro mucho empieza como a quedarse congelado el programa y no se actualiza la ventana. No se si es cosa de mi código o es cosa del ordenador que últimamente con las calores no va muy bien. ¿Alguien puede analizarlo y decirme si ve algo raro? Si se puede simplificar mas mejor pero yo no he visto otra manera.
Responder Con Cita
  #12  
Antiguo 03-06-2013
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Me di cuenta de que algo raro pasaba y que hacia la derecha y hacia abajo no mostraba toda la imagen y al final queda así:

Código:
void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
        //Aqui hacemos que cuando arrastremos la imagen esta se vaya moviendo por el ScrollBox
        //y le asignamos el cursor deseado
        TControl *Ctrl = static_cast<TControl*>(Sender);

        if (Moving)
        {
                if((Ctrl->Left + X + Ctrl->Left - TheSpot->x <= 0) &&
                   (Ctrl->Width - ScrollBox->Width + Ctrl->Left + X - TheSpot->x >= -3) &&
                   (Ctrl->Top + Y + Ctrl->Top - TheSpot->y <= 0) &&
                   (Ctrl->Height - ScrollBox->Height + Ctrl->Top + Y - TheSpot->y >= -3))
                {
                        Ctrl->Left = X + Ctrl->Left - TheSpot->x;
                        Ctrl->Top  = Y + Ctrl->Top - TheSpot->y;
                }
                else if((Ctrl->Left + X + Ctrl->Left - TheSpot->x <= 0) &&
                   (Ctrl->Width - ScrollBox->Width + Ctrl->Left + X - TheSpot->x >= -3))
                {
                        Ctrl->Left = X + Ctrl->Left - TheSpot->x;
                }
                else if((Ctrl->Top + Y + Ctrl->Top - TheSpot->y <= 0) &&
                   (Ctrl->Height - ScrollBox->Height + Ctrl->Top + Y - TheSpot->y >= -3))
                {
                        Ctrl->Top  = Y + Ctrl->Top - TheSpot->y;
                }
        }
}
Funciona bien pero no se porque cuando llego al final de la imagen le falta un pelin para llegar al final de ella y tengo que soltar, hacer clic de nuevo y volver a arrastrar. El -3 es porque el borde del ScrollBox me tapa un pelin la imagen por alli y con ese -3 se ve entera.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar estructura Type de delphi a Builder.. Novatin C++ Builder 4 31-05-2013 19:00:35
pasar codigo de delphi a c++ Builder rxaxx9 C++ Builder 2 13-05-2012 06:27:17
codigo en delphi a c++ builder zidfrid C++ Builder 4 09-07-2008 14:34:29
Convertir codigo Delphi a Builder _Willa C++ Builder 3 15-02-2008 11:37:10
Cambiando el codigo de delphi a builder... paco_galo C++ Builder 5 03-12-2007 22:14:54


La franja horaria es GMT +2. Ahora son las 06:09:51.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi