Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Já que diz ser marinheiro de primeira viagem e não querendo descartar a sugestão do colega Eder Moraes (ela pode ser aplicada em situações específicas, mas pelo que você colocou não parece ser o seu caso), acredito provevelmente você pode, como disse o colega Ruyfreis, não ter associado seu dataset (no caso, uma query - Q_kits) a respectiva propriedade do QuickRep. Observe também que além do componente QuickRep que você adiciona ao form para produzir o relatório, você necessitará no mínimo de adicionar um componente QRBand (da paleta do quickreport), no qual você deverá definir sua propriedade BandStyle para rbDetail (isto é o equivalente a dizermos que você adicionou uma banda detalhe). Nesta banda você deverá colocar tantos QRDBText's quanto forem necessários para associá-los aos campos do dataset que você pretende mostrar. Esta banda será responsável pela "impressão linha-a-linha" dos registros retornados por seu dataset. Se você simplesmente adicionou seus QRDBText's no QuickRep, e não numa banda deste tipo, este pode ser uma outra situação em que apenas um registro é impresso. []s
  2. Micheus

    Delphi

    Ruyfreis, também acho que o Delphi vai longe, mesmo que não hajam mais atualizações do programa. Entretanto, você está em uma idade em que ainda tem muito neorôneo para queimar :D. Como sugeriu o Denis, não se prenda a uma só linguagem, se deseja se manter nesta área, procure aprender outras. A nova onda é o .NET? Então procure obter algum conhecimento sobre ela. Java? É bom ter uma idéia sobre o que é isto. Enfim, há bastante mercado para aplicações em Delphi baseadas e VCL, mas também há bastante empresas trabalhando com .NET e Java. Isso sem contar, que em se tratando de desenvolvimento web você pode ouvir falar de PHP, ASP, XML, AJAX,.... Esse negógio vai longe. Sobre o assunto em outro forum -> link Um artigo recente e... Tire suas conclusões -> link []s
  3. Basta somente {$R Comp.res} Correto!! Neste caso você estaria falando de apenas uma imagem. Acredito que o seu interesse fosse conseguir acessar a lista de imagens do ImageList. Andei tentando pesquisar o fonte do TCustomImageList (ImgList.pas), para tentar achar uma referência ao Editor que é utilizado para adicionar-mos as figuras ao ImageList, mas não achei nada. Neste caso, se você não achar solução ou outro colega não auxiliar, acho que será o caso de criar seu próprio editor de propriedades para inclusão das imagens em tempo de desenho.Sei que você não gosta muito dessa coisa de por o código do programa à um post, mas tentando achar um meio de lhe ajudar, criei um componente básico apenas com um create, destroy e paint. Notei que também haverá um problema relacionado ao tamanho do bitmap carregado. No exemplo de código abaixo, se for omitidas as mudanças de tamanho do bitmap lido, ocorrerá um erro referente ao tamanho do mesmo ser incompatível. Lembre-se que o editor do ListImage, permite que você decida de a imagem será Redimensionada, Centralizada ou Cortada, sempre de acordo com as dimensões configuradas na propriedade Width e Height do ListImage. Após adiconar o componente no form, acontece um efeito "interessante": são desenhados retângulos brancos, mas quando o programa é executado a imagem é desenhada corretamente. :huh: ... Implementation {$R GCBitmaps.res} constructor TGCBitmaps.Create(AOwner: TComponent); function InsertBitmapRes(BMPResName :string) :boolean; var BMP :TBitmap; CharArray: array[1..50] of char; begin Result := False; BMP := TBitmap.Create; try BMP.Handle := LoadBitmap(HInstance, StrPCopy(@CharArray, BMPResName)); BMP.Width := FImageList.Width; BMP.Height := FImageList.Height; try Result := FImageList.Add(BMP, nil) = 0; except Raise Exception.Create('Erro tentando adicionar bmp'); end; finally BMP.Free; end; end; begin inherited; Width := 32; Height := 32; FImageList := TImageList.Create(Self); FImageList.Width := 32; FImageList.Height := 32; InsertBitmapRes('BITMAP1'); InsertBitmapRes('BITMAP2'); end; destructor TGCBitmaps.Destroy; begin FImageList.Free; inherited; end; procedure TGCBitmaps.Paint; var Image :TBitmap; YPos, Idx :Integer; begin Inherited; Image := TBitmap.Create; try YPos := 0; for Idx := 0 to FImageList.Count -1 do begin FImageList.GetBitmap(Idx, Image); Canvas.Draw(0, YPos, Image); Inc(YPos, Image.Height +2); end; finally Image.Free; end; end;
  4. Thales, se entendi direito, quando você criar seu componente (método Create) irá também inicilizar a lista neste momento e não em tempo de desenho como se faz normalmente com o TImageList. É isto?
  5. Micheus

    Resgatar mês

    Gafanhoto, se for no código delphi, você pode pode utilizar a função DecodeDate (unit SysUtils) ou, se utilizar D7 pode ser a função MonthOf (unit DateUtils). var Ano, mês, Dia: Word; begin DecodeDate(Date, Ano, mês, Dia); Label1.Caption := Format('Mês da data atual: %d = %s', [mês, LongMonthNames[mês]]); mês := MonthOf(Date); Label2.Caption := Format('Mês da data atual: %d', [mês]); end; Seria isto? []s
  6. Dá uma olhada neste link e veja o uso do WMI (Windows Management Instrumentation) lhe atende.
  7. Micheus

    Dbgrid

    Acho que seria algo assim: procedure TForm1.FormShow(Sender :TObject); begin // força a inicialização pelo campo da primeira coluna DBGrid1TitleClick(DBGrid1.Columns[0]); end; ... procedure TForm1.DBGrid1TitleClick(Column: TColumn); var Idx :Integer; begin // Alteração da query ordenando pelo campo "clicado" with DBGrid.DataSource.DataSet as TIBQuery do begin; Idx := Pos('ORDER BY ', UpperCase(SQL.Text)); if Idx > 0 then begin SQL.Text := Copy(SQL.Text, 1, IdX -1); SQL.Text := SQL.Text +'ORDER BY '+Column.FieldName; end; Close; Open; end; // restaurando a cor do título DBGrid1.Columns[DBGrid1.Tag].Title.Color := clBtnFace; DBGrid1.Columns[DBGrid1.Tag].Title.Font.Color := clWindowText; DBGrid1.Columns[DBGrid1.Tag].Title.Font.Style := []; // guarda a coluna selecionada DBGrid.Tag := Column.Index; // alterando a cor do título do campo ordenado DBGrid1.Columns[DBGrid1.Tag].Title.Color := $00BE7C7C; DBGrid1.Columns[DBGrid1.Tag].Title.Font.Color := clWhite; DBGrid1.Columns[DBGrid1.Tag].Title.Font.Style := [fsBold]; end;
  8. Micheus

    Internet Explorer

    Eder, dê também uma olhada nesta chave do windows: HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Security
  9. Micheus

    Dbgrid

    maikel O procedimento é este mesmo, mas observe que Andreia está utilizando Query, o que não vai permitir usar (não que eu saiba): A cláusula order by da query é que deverá ser ajusta para ordenar pelo campo selecionado. []s
  10. ClaudioX, pelo trecho de código parece que você está usando a sintax do C, não pascal. Mesmo assim acho que o que está faltando seria o mesmo que faltaria no delphi: Acrescentar de onde provém o TabSheet1. Seria algo assim (?):if(Form1->Abas->ActivePage==Form1->TabSheet1)
  11. Micheus

    Dbgrid

    Os dados para o DBGrid virão de uma tabela ou query? Qual o banco que você vai utilizar?
  12. Micheus

    Duvida Na Procedure

    No FireBird seria: CREATE PROCEDURE MAX_PROJETO RETURNS (RESULT INTEGER) AS begin for select COUNT(codigo) from projeto group by codigo into :RESULT do begin end if (:RESULT is null) then RESULT = 0; suspend; end Note que COUNT, não é a mesma coisa que MAX. Então verifique o que você realmente deseja utilizar. O nome da procedure sugere que seja o MAX.
  13. Assim, na verdade desaparecia após ser encoberto e ao ser exibida a tela novamente, o processo funcionava normalmente - "sumindo" com o botão - o que caracteriza um problema no processo de desenho do botão. Nestas circustâncias, acho que é sempre mais conveniente tentar encontrar a origem do problema. Essa parte eu não tinha conhecimento (nunca havia percebido que ocorria). Obrigado pela explicação. :) []s
  14. s3c, fazer Bt.Parent := nil até funciona, mas não é o tipo de ação correta - você está apenas "dizendo" que ele não tem um "local onde se desenhar" (é um quebra-galho). Positivo. Realmente não é necessário incluir nos eventos Enter e Leave o teste de visibilidade. Nestes deveriamos, na verdade, fazer outro teste: procedure TEncartaButton.MouseEnter(var Message: TMessage); var TextWidth, TextHeight : Integer; begin if csDesigning in ComponentState then Exit; TextWidth := Canvas.TextWidth(Cap); TextHeight := Canvas.TextHeight(Cap); ... procedure TEncartaButton.MouseLeave(var Message: TMessage); var TextWidth, TextHeight : Integer; begin if csDesigning in ComponentState then Exit; TextWidth := Canvas.TextWidth(Cap); TextHeight := Canvas.TextHeight(Cap); ...Porque, se você obsevar, quando o botão é colocado no form, durante o desenho do mesmo, o botão já está "operando" (muda a cor quando tem o foco) - coisa que normalmente não encontramos em qualquer componente padrão. []s
  15. D4n1l0d, eu testei com D7 (hoje) e funciona. Então segue abaixo a declaração completa do primeiro botão para você comparar: type TEncartaButton = class(TGraphicControl) private Cap : string; Col : TColor; Border: TColor; OverFColor: TColor; OverColor: TColor; DownColor: TColor; MDown: TMouseEvent; MUp: TMouseEvent; MEnter : TNotifyEvent; MLeave : TNotifyEvent; Enab: Boolean; Bmp: TBitmap; SCap: Boolean; BtnClick: TNotifyEvent; procedure SetCol(Value: TColor); procedure SetBorder(Value: TColor); procedure SetCap(Value: string); procedure SetBmp(Value: TBitmap); procedure SetSCap(Value: Boolean); protected procedure Paint; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseEnter(var Message: TMessage); message CM_MOUSEENTER; procedure MouseLeave(var Message: TMessage); message CM_MOUSELEAVE; procedure Click; override; procedure SetParent(Value: TWinControl); override; public constructor Create(AOwner: TComponent); override; published property Caption : string read Cap write SetCap; property Color : TColor read Col write SetCol; property ColorBorder : TColor read Border write SetBorder; property Enabled : Boolean read Enab write Enab; property OnMouseDown: TMouseEvent read MDown write MDown; property OnMouseUp: TMouseEvent read MUp write MUp; property OnMouseEnter: TNotifyEvent read MEnter write MEnter; property OnMouseLeave: TNotifyEvent read MLeave write MLeave; property OnClick: TNotifyEvent read BtnClick write BtnClick; property Glyph: TBitmap read Bmp write SetBmp; property ColorOverCaption: TColor read OverFColor write OverFColor; property ColorOver: TColor read OverColor write OverColor; property ColorDown: TColor read DownColor write DownColor; property ShowCaption: Boolean read SCap write SetSCap; property ShowHint; property ParentShowHint; property OnMouseMove; property Font; property Visible; end; Só para salientar, quando eu falei em publicar a propriedade quiz chamar a tenção para o fato de que esta propriedade deverá ser declarada na cláusula published da classe. Realmente fica meio ruim de ler o código quando não está identado. Caso continue com este problema, você pode incluí-lo simplesmente digitando os comandos antes([ code]) e depois([ /code]) do seu texto (o espaço após o "[" não deve ser incluido). []s
  16. D4n1l0d, Se é descendente de TGraphiControl então ele tem. O que ocorre é que o método está na seção Protected da classe - o que o deixa "oculto".A propriedade Visible também existe, como você já constatou, mas se também quizer que a propriedade Visible apareça no Object Inspector - para alterá-la em design-time, você deve publicar esta propriedade. Basta acrescentar o código abaixo: TEncartaButton = class(TGraphicControl) private ... property OnMouseMove; property Font; property Visible; end; O problema com a visibilidade do botão citado está relacionado ao fato de que o mesmo sofre alteração (desenho) não apenas no método Paint. Quando o mouse move-se por ele ou deixa ele, estes eventos também desenham no canvas. E não leva em consideração se o botão está visível ou não. Eu percebi que através de um botão comum (TButton) ele aparecia e sumia corretamente. Daí caiu a ficha de olhar outro lugar que não os associados ao Paint. Como você está sobre o botão quando clica nele e altera sua visibilidade, o evento MouseUp redesenha o botão - por isso não "sumia". Mas quando você colocava uma outra janela sobre ele, ao retirá-la quem desenhava o botão era o método Paint e, neste caso, a questão da visibilidade era respeitada. Inclua os testes referentes a propriedade Visible como abaixo para corrigir o problema:procedure TEncartaButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var TextWidth, TextHeight : Longint; begin inherited MouseDown(Button, Shift, X, Y); if Not Visible then Exit; TextWidth := Canvas.TextWidth(Cap); TextHeight := Canvas.TextHeight(Cap); ... procedure TEncartaButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var TextWidth, TextHeight : Longint; MouseOverButton: Boolean; P: TPoint; begin inherited MouseUp(Button, Shift, X, Y); if Not Visible then Exit; TextWidth := Canvas.TextWidth(Cap); TextHeight := Canvas.TextHeight(Cap); ... procedure TEncartaButton.MouseEnter(var Message: TMessage); var TextWidth, TextHeight : Integer; begin if Not Visible then Exit; TextWidth := Canvas.TextWidth(Cap); TextHeight := Canvas.TextHeight(Cap); ... procedure TEncartaButton.MouseLeave(var Message: TMessage); var TextWidth, TextHeight : Integer; begin if Not Visible then Exit; TextWidth := Canvas.TextWidth(Cap); TextHeight := Canvas.TextHeight(Cap); ... Eu não verifiquei os demais tipos de botões na unit. Talvez seja conveniente verificar se há algo similar. []s
  17. Micheus

    Canvas

    Acho que não. Voce deriva seu componente do TGraphicControl e sobrescreve o procedimento Paint (chamado quando é necessário repintar o componente). Por ex.: ... type TGControl = class(TGraphicControl) protected procedure Paint; override; end; ... procedure TGControl.Paint; begin // aqui dentro você desenha o que quiser Canvas.RoundRect(0, 0, width, height, 5, 5); end;
  18. Ruyfreis, o que podemos utilizar para interromper o processamento do programa num determinado ponto são as exceções - Abort é muito útil em alguns casos. Então, com o que já coloquei, devemos trabalhar a construção de nosso código. Tenha em mente que o Abort irá parar a execução do programa, contudo "respeitando" as questões ao tratamento de exceção - quando houver. Voce deve avaliar se por acaso ele já não irá atender a suas necessidades. Se o que você colocou inicialmente: corresponde a mais ou menos ao exemplo no post anterior (quando falei sobre Procedure Abort - o 2º ex.), então o uso da mesma lhe basta.Se você quizer uma opnião sobre seu caso, post o código do procedimento que você chama e o do evento OnClick de onde você chama este procedimento. []s
  19. D4n1l0d, talvez você estivesse postando esta mensagem enquanto eu escrevia a minha. Na verdade não são iguais. Veja o que diz o help: procedure Exit; => Exit exits from the current procedure. na descrição está: - If the current procedure is the main program, Exit causes the program to terminate. (se o procedimento o programa principal, Exit terminará o programa); - Exit will cause the calling procedure to continue with the statement after the point at which the procedure was called. (Exit fará com que o procedimento siga com as instruções após o ponto em que a procedure foi chamada - mais ou menos isto). Ex: procedure Form1.Calcula; begin if True then Exit; end; procedure TForm1.ButtonClick(Sender :TObject); begin Calcula; ShowMessage('Executou após o exit'); end; procedure Abort; => Abort ends the process without reporting an error. na descrição está: - Use Abort to escape from an execution path without reporting an error. (utilize Abort para "cancelar" a execução sem que um erro seja informado) - Abort raises a special "silent exception" which operates like any other exception (Abort "gera" uma exceção silenciosa especial que opera como qualquer outra exceção). Ex:procedure Form1.Calcula; begin if True then Abort; end; procedure TForm1.ButtonClick(Sender :TObject); begin Calcula; ShowMessage('Não será executado'); end; O único meio de haver continuação neste código seria tratar a exceção:procedure Form1.Calcula; begin if True then Exit; end; procedure TForm1.ButtonClick(Sender :TObject); begin try Calcula; ShowMessage('Não será executado'); except ShowMessage('Executou após o Abort'); end; end; Vamos aproveitar a oportunidade para trocarmos idéias.
  20. A principal função do Raise é permitir que você chame (construa) uma exception. Um exemplo encontrado no help do Delphi: type EPasswordInvalid = class(Exception); ... if Password <> CorrectPassword then raise EPasswordInvalid.Create('Incorrect password entered'); ou poderia ser criada simplesmente com: raise Exception.Create('Incorrect password entered'); No caso específico de quando você trata uma exceção (utilizando try...except...end) o uso do Raise (como no exemplo) fará com que a o processo de tratamento da exceção continue. Vamos ver se consigo explicar melhor. Se não utilizarmos o tratamento de exceção, quando tivermos uma sequencia de instruções no código, ao falhar uma delas será apresentada uma mensagem informando a exceção e as instruções seguintes não serão executadas (o processamento parou). Isto é o que normalmente não desejamos que ocorrra, por isso frequentemente utilizamos o tratamento de exceção para poder manipular corretamente estas situações. Um exemplo simples:... Data := StrToDate(Edit1.Text); if Data > Date then ShowMessage('Data não pode ser posterior a atual'); ... Na situação acima, se o conteúdo de Edit1.Text for inválido o programa apresentará a mensagem padrão (em inglês) para este tipo de erro e o teste (if) não será executado. Poderiamos melhorar isto, fazendo o tratamento da exceção:... try Data := StrToDate(Edit1.Text); except Edit1.SetFocus; ShowMessage('Data inválida. Informe novamente'); end; if Data > Date then ShowMessage('Data não pode ser posterior a atual'); ... Agora, quando a conversão resultar em erro, moveremos o foco devolta para o campo em questão e mostraremos uma mensagem em português. Só que após o usuário clicar no OK da mensagem, o programa seguirá e o teste (if) será realizado - o que não seria correto. Um meio de contornar-mos isto seria adicionar: - uma chamada ao procedimento Exit após o ShowMessage dentro da cláusula except. Só que neste caso, apenas o seguimento do código dentro do procedimento atual será "pulado" (o programa continua); - uma chamada ao procedimento Abort após o ShowMessage dentro da cláusula except. (o programa pára). Mas, gosto mais da próxima abordagem:... try Data := StrToDate(Edit1.Text); except on E:Exception do begin Edit1.SetFocus; E.Message := 'Data inválida. Informe novamente'; Raise; end; end; if Data > Date then ShowMessage('Data não pode ser posterior a atual'); ... Nesta situação, após mover o foco para o componente desejado, alteramos a mensagem padrão que seria apresentada (caso não estivessemos tratando o erro) e "forçamos" que o processo do tratamento de exceção continue (usando o Raise). Isto resulta numa janela de diálogo padrão para exceção, com uma mensagem em português e a execução do programa pára neste ponto. A instanciação das exceções (on E:<tipo de exceção> do) nos permite melhorar muito a interação com o usuário no sentido de apresentar mensagens claras. No exemplo acima, utilizei a classe TException que é a classe base, logo qualquer tipo de exceção será interceptada nesta seção do código. Mas poderíamos tratar da seguinte forma:... try Data := StrToDate(Edit1.Text); except on E:EConvertError do begin Edit1.SetFocus; E.Message := 'Data inválida. Informe novamente'; Raise; end; on E:Exception do begin E.Message := 'Erro desconhecido na conversão da data'; Raise; end; end; if Data > Date then ShowMessage('Data não pode ser posterior a atual'); ... Espero ter exclarecido minhas colocações anteriores e desculpem-me por ter me alongado, mas achei que poderia ser útil. Qualquer comentário e correções são bem vindos.
  21. Como mensionei, o help define Abort como uma exception silenciosa. Isso implica no fato de que se você utilizar o Abort numa parte do código que esteja sendo tratada por uma try...except (dentro dele) o procedimento se comportará exatamente como qualquer outra exception.Vamos supor algo assim: procedure TForm1.GravaTabela; begin ... try tabela1.post; if Teste = false then Abort; except ShowMessage('Não foi possível gravar'); end; ... end; procedure TForm1ButtonClick(Sender :TObject); begin ... GravaTabela; ShowMessage('Executou comando apos GravaTabela'); end; Neste exemplo, o try...except pretende tratar o Post na tabela, mostrando um diálogo "normal", não o diálogo padrão para exceptions(com a mensagem em inglês) e sem abortar a sequência de execução do programa. Porém, se Teste for falso haverá execução do Abort. Como resultado o código existente entre exception...end será executado. O que seria outro problema, já que resultaria numa mensagem falsa. Neste exemplo ("didático"), a mensagem existente após a chamada do procedimento (no evento onclick do botão) será executada, fato que não ocorreria se o Abort não estivesse dentro do try...except. Uma alternativa seria modificar o código dentro do except...end para: ... except on E:Exception do begin E.Message := 'Não foi possível gravar'; raise; end; end; ...Com isto, a exception continua sendo executada - abortando - a execução do programa, apresentando a mensagem desejada, porém, curiosamente, se for executada em decorrência do Abort, não será apresentada a mensagem configurada (está associado ao tipo da exception - "silenciosa"). Agora é avaliar seu código e ver se terá que ajustar a este tipo de situação. Consegui explicar ou compliquei mais? :unsure:
  22. Micheus

    Resolução

    Mais detalhes dê uma olhada no Help da API do Windows (Windows SDK) procedure Resolucao800x600; var DevMode :TDevMode; begin EnumDisplaySettings(nil, // nil=display corrente 0, // deve ser zero na primeira chamada DevMode); // retorno das confirgurações if (DevMode.dmPelsWidth <> 800) and (DevMode.dmPelsHeight <> 600) then begin // atribui nova resolução DevMode.dmPelsWidth := 800; DevMode.dmPelsHeight := 600; // define que parâmetros foram alterados DevMode.dmFields := DM_PELSWIDTH or DM_PELSHEIGHT; // if ChangeDisplaySettings(DevMode, // Parâmtros a aplicar 0) <> DISP_CHANGE_SUCCESSFUL then // 0=Alteração dinâmica da resolução // *** se for mudar na configuração do usuário, utilize CDS_UPDATEREGISTRY no lugar do zero MessageBox(0, 'Erro alterando a resolução de vídeo', 'Confuguração de Vídeo', MB_OK); end; end;
  23. O mais correto é que você transforme sua procedure em uma function onde você retorna false e utiliza esta informação para implementar o que você solicita. Vamos supor: function TForm1.ProcessaAlgo :Boolean; begin Result := False; // inicializa como não processada ... if CondicaoNaoContinua then Exit; // forçará a saída da procedure ... Result := True; // Significa que processou toda a function end; ... procedure TForm1Button1Click(Sender :TObject); begin ... if not ProcessaAlgo then // Aqui você testa se a function foi ou não processada Exit; // Sai sem executar o que estiver depois. ... end; Considero esta uma forma mais limpa de pular processos. Existe um procedure Abort (na SysUtils) que é uma exception silenciosa (ver help), mas acredito que não seja o caso de usá-la. []s
  24. Micheus

    Links

    Extensão para a Graphics do Delphi. Permite carregar inúmeros tipos de arquivos gráficos, como PhotoShop(*.psp, *.psd, *.pdd), Kodak(*.pcd), Truevision(*.tga; *.vst; *.icb; *.vda; *.win), GFI fax images (*.fax) e outros. GraphicEx -> Link
  25. você precisa apenas: - Incluir a unit Jpeg; - usar: Image1.Picture.LoadFromFile('c:\arquivo.jpg'); (já que você adicionou um Image no form). []s
×
×
  • Criar Novo...