GARANTIR DESCONTO

Fórum limitar área de edição do edit #339277

24/03/2007

0

Pessoal, seguinte: estou fazendo um componente que é um edit com um botão do lado. Existeme milhares de componentes, na biblioteca Jedi e outras, que fazem isso que eu quero, porém, eu estou criando uma pequena biblioteca de componentes com comentários em portiuguês, para fins didáticos. por isso estou criando os componentes o mais simplificadamente possivel.

Meu problema consiste no seguinte: quando eu digito no edit o texto ´invade´ o botão, ou fica por trás deste.

Como eu posso limitar a área de edição do edit?

Grato!


Vitor Rubio

Vitor Rubio

Responder

Posts

24/03/2007

Essistemas

Se vc estiver usando TEdit, tem uma propriedade chamada
Maxlenght !.


Responder

Gostei + 0

25/03/2007

Adriano Santos

Se vc estiver usando TEdit, tem uma propriedade chamada Maxlenght !.

Neste caso não vai adiantar colega, pois e se o programador que está usando componente aumentar ou diminuir a largura do componente? e se o cara quer um componente com uma largura pequena, mas que suporte 200 caracteres?
Tem é que descobrir como fazer para que o texto digitado fique por baixo do button que está sendo criado.


Responder

Gostei + 0

26/03/2007

Vitor Rubio

max lenght não resolve, quero que o lenght seja infinito. Não quero que o texto apareça por trás ou por cima do botão que está dentro do edit, quero que ele pare justamente naquele ponto e comece a rolar para a esquerda igual acontece com um edit normal que não cabem mais caracteres ou um combo.

Um exemplo de componente que faz o que eu quero é o TJvComboEdit, da biblioteca Jedi. Alguém usa Jedi?

Quero fazer um componente igual aquele, para meu próprio aprendizado, mas não quero copiar e colar da Jedi antes de entender o que eu estou fazendo.


Responder

Gostei + 0

11/05/2007

Adriano Santos

Vitor, só ressussitanto o tópico. Vc conseguiu resolver o problema? Cara, to precisando desenvolver tb um componente assim. Pode me dar uns toques?

Vlw.


Responder

Gostei + 0

12/05/2007

Aasn

Olá Vitor,
a maneira mais prática de fazer isso é criar um ´container´ e nele inserir um edit e um botão, publicar eventos e propriedades desses subcomponentes...

Qualquer dúvida te mando um exemplo

[]´s
AASN


Responder

Gostei + 0

13/05/2007

Paullsoftware

vc poderia postar o cídigo aqui pra beneficiar a todos...


Responder

Gostei + 0

14/05/2007

Aasn

Aí está o código pessoal, espero que dê uma ajuda...

unit AASNEditList;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  stdctrls, Mask, ToolEdit, DsgnIntf;

type

  TAASNEditList = class(TCustomControl)
  private
    { Private declarations }
    FText : String;
    FItems: TStrings;
    FOnButtonClick: TNotifyEvent;
    procedure SetText(valor: string);
    procedure SetItems(valor: TStrings);
    procedure ButtonClick(Sender: TObject);
    procedure TeclaEnter(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure TeclaDel(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Notification(AComponent: TComponent; Operation: TOperation);
  protected
    { Protected declarations }
  public
    { Public declarations }
    Edit : TComboEdit;
    Lista : TListBox;
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
  published
    { Published declarations }
    property Color;
    property Ctl3D;
    property Enabled;
    property Font;
    property Text : String read FText write SetText;
    property Items : TStrings read FItems write SetItems;
    property OnButtonClick : TNotifyEvent read FOnButtonClick write FOnButtonClick;
    procedure SetBounds(ALeft: Integer; ATop: Integer; AWidth: Integer; AHeight: Integer); override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents(´Geral´, [TAASNEditList]);
end;

procedure TAASNEditList.TeclaEnter(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var FEditTmp : TCustomForm;
begin
if Key = VK_RETURN then
   begin
   Key := 0;
   if Trim((Sender as TComboEdit).Text) <> ´´ then
      begin
      Lista.Items.Add((Sender as TComboEdit).Text);
      (Sender as TComboEdit).Text := ´´;
      end
   else
      begin
      FEditTmp := GetParentForm(self);
      PostMessage(FEditTmp.Handle, WM_NEXTDLGCTL, 0, 0);
//      with Screen.ActiveForm do
//           Perform(WM_NEXTDLGCTL,0,0);
      end;
   end;
end;

procedure TAASNEditList.TeclaDel(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var i : integer;
begin
if Key = VK_DELETE then
   begin
   for i := (Sender as TListBox).Items.Count - 1 downto 0 do
       if (Sender as TListBox).Selected[i] then
          (Sender as TListBox).Items.Delete((Sender as TListBox).ItemIndex);
   end;
end;

constructor TAASNEditList.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Width  := 100;
  Height := 100;
  Ctl3D  := False;

  Edit := TComboEdit.Create(self);
  with Edit do
       begin
       Parent := Self;
       Left   := 0;
       Top    := Self.Top;
       Width  := Self.Width;
       GlyphKind := gkEllipsis;
       CharCase  := ecUpperCase;
       OnKeyDown := TeclaEnter;
       OnButtonClick := ButtonClick;
       end;

  FItems := TStringList.Create;

  Lista := TListBox.Create(self);
  with Lista do
       begin
       Parent := Self;
       Left   := 0;
       Top    := Self.Top + Edit.Height;
       Width  := Self.Width;
       Height := Self.Height - Edit.Height;
       OnKeyDown := TeclaDel;
       TabStop := False;
       end;

end;

procedure TAASNEditList.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
  if (ATop > 0) and (AWidth > 0) and (AHeight > 0) then
     begin
     Edit.SetBounds(0, 0, AWidth, Edit.Height);
     Lista.SetBounds(0, Edit.Height, AWidth, AHeight - Edit.height);
     end;
end;

procedure TAASNEditList.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if Operation = opRemove then
     begin
     if AComponent = Edit then
        Edit := nil
     else if AComponent = Lista then
        Lista := nil;
     end;
end;

destructor TAASNEditList.Destroy;
begin
  inherited Destroy;
end;

procedure TAASNEditList.ButtonClick(Sender: TObject);
begin
if Assigned(OnButtonClick) then
   OnButtonClick(Sender);
end;

procedure TAASNEditList.SetText(valor : string);
begin
FText := valor;
Edit.Text := valor;
end;

procedure TAASNEditList.SetItems(valor : TStrings);
begin
FItems.Clear;
FItems.AddStrings(valor);
Lista.Clear;
Lista.Items.AddStrings(valor);
end;

end.


...qualquer dúvida é só falar!

[]´s
AASN


Responder

Gostei + 0

14/05/2007

Aasn

Só comentando um pouco sobre o componente...

Criei este componente com o intuito de que o cliente pudesse armazenar uma lista contendo características comuns a um determinado ítem...

A medida em que o usuário vai digitando e teclando ´enter´ as informações vão sendo armazenadas no listbox abaixo, e através do ´del´ pode-se eliminar ítem ou itens selecionados...

O botão junto ao edit serve para que o sistema possa chamar uma rotina qualquer, já é do conhecimento de todos o funcionamento dele.

Espero ter colaborado.

[]´s
AASN

p.s.: Talvez não seja exatamente o que o Vitor queria mas dá para ter uma idéia de como fazer, o princípio é o mesmo.


Responder

Gostei + 0

14/05/2007

Vitor Rubio

muito legal, mas se fizer desse jeito, o edit não fica sendo descendente de TcustomEdit, sendo assim, ele pode ser usado para receber dados normalmente, mas não pode ser usado em rotinas genéricas que lidem com vários tipos de edits diferentes (data-aware, memo etc...)

por exemplo, o ´if (seuEdir is TcustomEdit) then´ não funcionaria


na biblioteca JEDI tem um edit assim pronto, que é justamente o que eu quero, um edit com botão, que o texto vai só até o botão, e é descendente de tcustomedit (láááá em cima) . Parece que ele funciona ao contrario: coloca um tcustomcontrol dentro do edit, sendo o edit seu parent, e coloca o botão nele, mas eu nunca entendi como código fonte desse componente funciona, pois ele é pouco comentado.

não quero fazer um componente para usar ou vender, meu objetivo é mais didático. Lógico que se eu pudesse substituir componentes da Jedi e outros de terceiros por componentes meus seria melhor.


Responder

Gostei + 0

14/05/2007

Adriano Santos

[quote:64ecd3e75e=´vitor^_^´]...Lógico que se eu pudesse substituir componentes da Jedi e outros de terceiros por componentes meus seria melhor.[/quote:64ecd3e75e]
Esse é sonho [b:64ecd3e75e]vitor^_^[/b:64ecd3e75e]. Os outros programadores que tinham na empresa pensavam apenas no presente e não no futuro. Ou seja, temos uns 300 componentes de terceiro instalados no Delphi e nosso sistema deve usar uns 200. Não consigo sair do Delphi 6 nem pra ir pro Delphi 7. Tudo isso pq o s caras pensavam assim: ah, quando for migrar pra outro Delphi a gente pensa nisso.
Estou com um programador aqui que pensa igual. Toda vez que ele precisa de algo ele mete outro componente em tela...cada dia que passa estamos mais afundados no Delphi 6. Sem condições de migrar.
A última dele foi colocar um componente que contém 1 Combo, 1 Edit e 1 SpeedButton. Quando vc sai do componente ele abre uma janelinha que tb é do componente. Pow, tudo isso pra não programar é mole? É mais fácil colocar componente e pronto né?


Responder

Gostei + 0

14/05/2007

Vitor Rubio

Veja bem, existem 4 tipos de componetes:

Gratuitos sem código fonte --> um terror, afaste-se deles, nunca use, fique longe

Pagos sem fonte --> outra droga. Perda de tempo e dinheiro. dinheiro jogado no lixo, sem garantia de atualização

Gratuitos com fonte (open-source) --> são ótimos, um bom exemplo é a JEDI. qulquer coisa, você mesmo pode alterar o fonte e atualizar. Você ainda pode colaborar com o projeto disponibilizando suas alterações.

Pagos com fonte --> embora não sejam livres, permitem a atualização/alteração/adaptação contanto que não sejam indevidamente distribuidos. A empresa que o fez garante a atualização, os testes, a manutenção e a correção de bugs, ou seja, assegura o funcionamento. Se por acaso a empresa fechar você fica com os fontes para fazer seu proprio componente. É um dos melhores tipos na minha opinião.


Mesmo assim, o delphi já vem com alguns componentes de terceiros instalados, para efeito de propaganda, que se você pensar que são compoentes do delphi e usar, já era, vc não migra mais. É o caso do quick report, rave report e paleta NM (nmftp, nmhttp etc).


Melhor que seu gerenciador de relatorios seja sempre comprado de terceiros com fontes. Os melhores na minha opinião são report builder e fast reports, mas dentre estes o fast report é fenomenal, sem comparações.


Mesmo com tudo isso de componentes disponíveis, eu acho que quem mais usa os componentes são aqueles que os criaram. Digo isso porque dente os mais de 1000 componentes da JEDI, uso apenas 3, fora um componente de criptografia (turbo-power lock box), compressão (zip master) e syntax-highlight (synedit), e um componente feito por mim.


não acredito que seja sonho, pois algumas empresas, inclusive um colega meu, substituem todos os componentes do delphi, ou de terceiros comprados, por componentes próprios, mesmo que sejam descendente deles, só para manter o mesmo componente (interface) externo. Se um dia mudar a base (biblioteca de componentes), é só mudar os ancestrais (de quem os componentes proprios herdam).


Responder

Gostei + 0

14/05/2007

Adriano Santos

[quote:5eef0b003a=´vitor^_^´]
não acredito que seja sonho, pois algumas empresas, inclusive um colega meu, substituem todos os componentes do delphi, ou de terceiros comprados, por componentes próprios, mesmo que sejam descendente deles, só para manter o mesmo componente (interface) externo. Se um dia mudar a base (biblioteca de componentes), é só mudar os ancestrais (de quem os componentes proprios herdam).[/quote:5eef0b003a]
Sonho sim cara, se olhar nosso projeto vai chorar de raiva. E o pior que tenho um programador aqui que tudo que vem enfia um componente de terceiro. Minha idéia é fazer uma paleta de componentes só nossa e incluir no projeto, assim a tecnologia fica em casa.

Qto a relatórios: usamos o RDPrint pq a maior dos nossos clientes usa matricial, então atende. E como o RDPrint tem uma boa visualização e impressão pelo modo gráfico tb ficamos com ele. R$ 90,00 de licença vale a pena. Agora, o cara colocar um TwwQuery ou TwwDataSource (InfoPower). Se vc olhar não tem nada de diferente.


Responder

Gostei + 0

14/05/2007

Vitor Rubio

Você é o Adriano da Revista ClubeDelphi, né? Se eu não me engano, esses dias, vc andou postando umas coisas no grupo delphi-boleto também?

Bom, Adriano, o problema da sua empresa é mais profundo. É tanto estrutural como de falta de comunicação. Também já vi programadores que aparecem do nada com uma penca de componentes que vc nunca viu na vida e enfia eles no programa. Isso dá muita raiva, principalmente se o componente apresenta bugs. Uma vez um programador apareceu com um componente que ele fez, sem fontes, só com os dcu´s e bpl compilados.

Demorei um dia inteiro para depurar um programa, até constatar que o bug era do componente. Como o programador não acreditou que o bug era do componente, tive que criar um programa exemplo, o mais simples possivel, que usasse somente o componente do cara e mais nenhum outro para ficar evidente onde estava o problema. Aí sim o cara detectou o erro mas não conseguiu corrigir... fez um downgrade na versão do proprio componente, baixando para uma versão que funcionava.


Tive um problema assim na outra empresa onde trabalhei. Tipo, como substituir todos os ibDataSets do projeto inteiro por sqlDataset(dbxpress)?

Acho que você pode solucionar seu problema assim:

encontre compoentes pagos com fonte ou open-source que façam a mesma coisa que seus componentes.

Crie componentes dummy (falsos) que tenham o mesmo nome, metodos e propriedades que os componentes que vc já esá usando, para que tenham as mesmas interfaces.
Na hora de implementar as funcionalidades dos componentes dummy, instancie e use os componentes novos que você comprou/baixou para realizar as operações. Seus componentes antigos agora podem ser facilmente substituidos pelos dummy.


Agora, como que um combo consegue ter um botão tentro de um edit, pra mim continua sendo um mistério.

Estou postando menos no forum hoje em dia porque estou trabalhando com C# agora.... (eu sei, me vendi à M$), mas continuo usando delphi para meus hobbies e bicos ^^


Responder

Gostei + 0

14/05/2007

Adriano Santos

[quote:56d898d3e9=´vitor^_^´]Você é o Adriano da Revista ClubeDelphi, né? Se eu não me engano, esses dias, vc andou postando umas coisas no grupo delphi-boleto também?
[/quote:56d898d3e9]
Sim, sou eu. Cara mando tanta mensagem que as vezes nem me lembro direito...rsrs. Fala o assunto que eu me lembro..hehe
[quote:56d898d3e9=´vitor^_^´]
Bom, Adriano, o problema da sua empresa é mais profundo. É tanto estrutural como de falta de comunicação. Também já vi programadores que aparecem do nada com uma penca de componentes que vc nunca viu na vida e enfia eles no programa. Isso dá muita raiva, principalmente se o componente apresenta bugs. Uma vez um programador apareceu com um componente que ele fez, sem fontes, só com os dcu´s e bpl compilados.

Demorei um dia inteiro para depurar um programa, até constatar que o bug era do componente. Como o programador não acreditou que o bug era do componente, tive que criar um programa exemplo, o mais simples possivel, que usasse somente o componente do cara e mais nenhum outro para ficar evidente onde estava o problema. Aí sim o cara detectou o erro mas não conseguiu corrigir... fez um downgrade na versão do proprio componente, baixando para uma versão que funcionava.


Tive um problema assim na outra empresa onde trabalhei. Tipo, como substituir todos os ibDataSets do projeto inteiro por sqlDataset(dbxpress)?
[/quote:56d898d3e9]
Realmente, meu problema é gravíssimo e não tem cura. Estou coordenando a equipe, mas tenho um fulano que não acata o que eu digo e quanto mais eu falo, mais o sistema fica afundado.
[quote:56d898d3e9=´vitor^_^´]
Acho que você pode solucionar seu problema assim:

encontre compoentes pagos com fonte ou open-source que façam a mesma coisa que seus componentes.

Crie componentes dummy (falsos) que tenham o mesmo nome, metodos e propriedades que os componentes que vc já esá usando, para que tenham as mesmas interfaces.
Na hora de implementar as funcionalidades dos componentes dummy, instancie e use os componentes novos que você comprou/baixou para realizar as operações. Seus componentes antigos agora podem ser facilmente substituidos pelos dummy.


Agora, como que um combo consegue ter um botão tentro de um edit, pra mim continua sendo um mistério.

Estou postando menos no forum hoje em dia porque estou trabalhando com C# agora.... (eu sei, me vendi à M$), mas continuo usando delphi para meus hobbies e bicos ^^[/quote:56d898d3e9]
Cacilda, legal essa idéia, mas não sei se é viável. Olha que o usamos na prática.

RXLib
LMD
InfoPower
OnGuarde
RDPrint
PrintFast
QuickReport
Reporter Builder
gbBoleto
Serial
IBO
VclZip
XpMenu

E fora os que estão escondidos que nem sei. Fogo.


Responder

Gostei + 0

14/05/2007

Vitor Rubio

rxlib vc pode substituir por JEDI sem alterar nada, a JEDI incorporou a rxlib e manteve os mesmod nomes de classes e componentes.

O VCL Zip é o que? compressão zip? se for, pode substituir pelo zipmaster ou a biblioteca de compressão que vem junto com a jedi.

Aconselho você a não usar 2 geradores de relatorio ao mesmo tempo, mas usar um só.

Esses 4 eu fiquei curioso, poderia dizer pra que serve?

LMD
InfoPower
OnGuarde
xpMenu


vlw


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar