Ir para conteúdo
Fórum Script Brasil

Micheus

Veteranos
  • Total de itens

    3.189
  • Registro em

  • Última visita

Tudo que Micheus postou

  1. Micheus

    Shadow, Blur?

    Churc, no seu exemplo parece que tratar-se de um contorno (Outline). Lembrei-me que há muito tempo (tem tempo :D), havia "passado os olhos" nas funções da API para manipulação de fonts. Eu dei uma olhada por aí mas não achei nenhum exemplo completo (exceto 1 - em VB - link). Falando na questão contorno, tem um exemplo gambiarra (link), mas acho que não tem um resultado muito legal - ele está no último post no link. Uma das funções que me referi é GetGlyphOutline. Com ela você tem a opção de retornar um bitmap com da letra com o font selecionado para o device context(DC) ou obter uma lista de pontos que lhe permite desenhar o fonte. você pode ainda definir uma escala para o resultado retornado através da matriz transformação que você passa para ela. Neste link tem um código incompleto mas que dá uma noção de como é utilizada a função. Ela sendo utilizada para retornar um bitmap, poderia servir para você desenhar o texto sobreponto o bitmap de um font menor sobre um maior, p.ex; Observe neste artigo que o bitmap retornado não é o convencional. Tem que ver o que você pretende fazer, se daria para partir para um caminho destes ou buscar outras alternativas. Com relação a recursos deste tipo, este link tem dicas/coisas legais. []s
  2. Eu já tinha observado esse lance do pontilhado. Inclusive quando você entra num tópico para visualizá-lo ou responder ele, já dá para saber se tem alguém respondendo ele. Mas, gostaria de aproveitar a oportunidade deste assunto(e do Moderador) para citar algo que não acho adequado e que talvez o colega Graymalkin(através de seus contatos ;)) possa passar a diante, se achar conveniente. É o seguinte, notei que se você por exemplo, estiver lendo um post e, aguardando por uma resposta, mandar atualizar a tela do navegador o contador de visualizações é incrementado (aquele do índice tópicos) - dá para deixar o Tópico Quente só clicando F5 :o. Acho que poderia ser levado em conta o fato de que a sessão é a mesma e então não incrementá-lo. []s
  3. D4n1l0d, caso você possa substituir o componente memo por um RichText, você teria algumas facilidades. Basta setar a propriedade PlainText para True e funcionaria como um memo comum. Ficaria assim: - O RichEdit, implementa busca apenas para frente, então na propriedade Options do FindDialog você teria de setar para True a opção frHideUpDown, para que o radiobutton Busca para Cima/Baixo não apareça; - O FindDialog.Execute você chama de onde quizer; seja botão ou atalho; - No evento OnFind do FindDialog, você escreve o seguinte código procedure TForm1.Button1Click(Sender: TObject); begin // força pesquisa começar sempre do início do texto // quando a caixa de diálogo é iniciada RichEdit1.SelLength := 0; RichEdit1.SelStart := 0; FindDialog1.Execute; end; procedure TForm1.FindDialog1Find(Sender: TObject); var FoundPos, StartSearch, EndSearch :LongInt; Options :TSearchTypes; begin // determina busca a partir da posição atual ou do início do texto // se você atribuir StartSearch := 0, então a pesquisa sempre // começa no início (pouco provável este uso) StartSearch := RichEdit1.SelStart +RichEdit1.SelLength; EndSearch := Length(RichEdit1.Text); // determina como será a busca - comparação Options := []; if frMatchCase in FindDialog1.Options then Options := [stMatchCase]; if frWholeWord in FindDialog1.Options then Options := Options + [stWholeWord]; // retorna a posição do texto encontrado ou -1 (não achou) FoundPos := RichEdit1.FindText(FindDialog1.FindText, StartSearch, EndSearch, Options); if FoundPos <> -1 then begin RichEdit1.SelStart := FoundPos; RichEdit1.SelLength := Length(FindDialog1.FindText); RichEdit1.SetFocus; end; end; Eu utilizo deste jeito e funciona a contento. []s
  4. Kindelis, uma sugestão é que separe as expressões "separadas" pelo OR com parênteses. Assim não resta dúvida de como a cláusula where será processada. Olhando o seu select, pura e simplesmente, e sem maiores detalhes de suas tabelas, acho que há um problema no relacionamento da sua query(veja texto em negrito), o qual provavelmente é o causador da falta de espaço (como tentei explicar no outro seu post): select P.Cod_prod, P.Cod_cat, P.Descricao, P.Preco_venda, P.Qtd_disp, F.Nome, CT.Categoria, C.Cod_car, Foto from carro.db as C, carroxprod.db as R, produtos.db as P, fornecedor.db as F, categoria.db as CT, montadora as M, veiculo as V where (P.Categoria = CT.Cod_cat and P.Forn_cat = F.Cod_forn and P.Cod_prod = R.Cod_prod and C.Cod_car = R.Cod_carro and C.montadora = M.Cod_Montadora and C.Veiculo = V.Cod_veiculo and C.Montadora = '<Montadora>') or (R.Cod_carro=0 and P.Categoria = CT.Cod_cat and P.Forn_cat = F.Cod_forn and P.Cod_prod = R.Cod_prod and C.montadora = M.Cod_Montadora and C.Veiculo = V.Cod_veiculo and C.Montadora = '<Montadora>') Acredito que o SQL abaixo deva ser o que você está procurando. Observe que quando R.Cod_car for igual a 0 (zero), você não terá como tentar relacionar Carro com Montadora e Veiculo, já que este item deveria existir na tabela Carro e aparentemente não existe. Seria isto? select P.Cod_prod, P.Cod_cat, P.Descricao, P.Preco_venda, P.Qtd_disp, F.Nome, CT.Categoria, C.Cod_car, Foto from carro.db as C, carroxprod.db as R, produtos.db as P, fornecedor.db as F, categoria.db as CT, montadora as M, veiculo as V where (C.Cod_car = R.Cod_car and P.Cod_prod = R.Cod_prod and C.montadora = M.Cod_Montadora and C.Veiculo = V.Cod_Veiculo and P.Cod_cat = CT.Cod_cat and P.Cod_forn = F.Cod_forn) and C.Montadora = '<Montadora>') or (0 = R.Cod_carro and P.Cod_prod = R.Cod_prod and P.Cod_cat = CT.Cod_cat and P.Cod_forn = F.Cod_forn) []s
  5. Micheus

    Pesquisa

    juniorboll, que informações você tem na tabela Frigorifico.db e DadosFrigorifico.db? As duas tem informações iguais e você quer juntar estas informações numa consulta só? Se for, utilizando o mesmo filtro? Comparação de um nome com o outro??? Falta mais detalhe para entender o que você precisa. []s
  6. Micheus

    Problema No Registro

    João, se entendi direito, o que você está precisando é setar a propriedade AutoEdit, do componente TDataSouce associado a seus componentes, para False. Desta forma, você terá que explicitamente acionar os métodos Edit ou Insert.
  7. Kindelis, para a primeira pergunta eu não faço idéia de uma resposta. Talvez sejam arquigos temporários. Já olhou o que tem dentro? você não estaria com pouco espaço no seu HD? A consulta está correta? Se ela envolver várias tabelas pode ocorrer que você não esteja relacionando corretamente elas e como resultado você terá muitas linhas como resultado (quanto mais tabelas envolvidas, registros nela - pior). Isso é comum quando o relacionamento envolve mais que um campo e você esquece de colocar um deles na sua cláusula where. Dê uma verificada. []s
  8. Tá ficando boa essa discursão... :) Pelo que eu entendí você quis dizer que o owner libera a memória alocada pelo gerenciador de memória da Borland para conter os campos das classes, e o Parent trata de liberar Handles e outros recursos requisitados ao Windows, né? Thales, penso que é isso. Mas como eu disse, olhei meio por cima. O correto seria depurar passo a passo para tirar a dúvida, só que estou meio sem tempo. Depende do caso. Veja abaixo. Ai é que está. Tentando achar um exemplo para isto, constatei o seguinte (código lá embaixo): - Se você definir o Owner, mas não definir o Parent, o Destroy é executado; - Se você não definir o Owner, mas definir o Parent, o Destroy é executado; Assim, se for um componente não visual, você terá que chamar explicitamente o Free caso não passe o Owner. Logo a minha primeira afirmativa não é 100% verdadeira, tem mesmo que depurar para entender o que acontece. E chamar Free, é problema? - Se tiver owner: não implicará em problema porque o próprio componente ao ser destruido "solicitará" sua exclusão da lista Components do Owner; (é só observar o ComponentCount) - Se tiver apenas Parent: também não é problema. Logo, acho que um bom hábito é: se você cria o componente em run-time, destrua ele em run-time. O Teste: É só criar uma classe derivada de TListBox em seu form, com o método Destroy, e colocar alí um break-point. você observará que ao sair (fechar) o form a execução parará exatamente lá. Não tem nenhuma chamada a FREE mesmo.type TForm1 = classe(TForm) ... end; TMyListBox = class(TListBox) destructor Destroy; override; end; ... destructor TMyListBox.Destroy; begin ShowMessage('Destruindo MyListBox'); inherited; end; procedure TForm1.FormCreate(Sender: TObject); begin // opção 1: sem owner, com parent // with TMyListBox.Create(nil) do // begin // Parent := Self; // opção 2: com owner, sem parent with TMyListBox.Create(Self) do begin // Parent := Self; Left := 120; Top := 8; Width := 250; Height := 300; end; end;
  9. Thales, eu sempre tive o mesmo pensamento do colega kmkg. Até já havia ficado com a "pulga atrás da orelha" quando no outro post ao "Paulo" você fez a mesma citação. Dei uma olhada por cima e aparentemente a coisa se mistura (coloquei as partes do código lá embaixo para tentar explicar melhor o que quero dizer). Tendo em mente que a lista Components de um form é incrementada a cada create dos componentes onde passamos o Owner e considerando que eu chame o método Free de um Form, será acionado o seu método Destroy que seguindo a questão de herança vai desencadear nossa análise no método Destroy da classe TWinControl: Observe que na classe TWinControl (destructor TWinControl.Destroy), um-a-um os componentes de sua lista serão destruídos. E para cada um deles, o método Destroy da classe TControl é acionado e, nele, o método SetParent(nil) fará com que o Parent remova o respectivo componente da tela. O que vejo é que o Owner elimina os componentes (estrutura do objeto) enquanto o Parent elimina(libera) os recurso de janela alocados, já que as classes são apenas um meio de facilmente trabalharmos com os recursos oferecidos pela API do windows. É maios ou menos isto, não sei se me expressei bem. []s destructor TCustomForm.Destroy; begin if not (csDestroying in ComponentState) then GlobalNameSpace.BeginWrite; try if OldCreateOrder then DoDestroy; MergeMenu(False); if HandleAllocated then DestroyWindowHandle; Screen.RemoveForm(Self); FCanvas.Free; FIcon.Free; FreeAndNil(FActionLists); inherited Destroy; // *** Desce mais um nível finally GlobalNameSpace.EndWrite; end; end; ============================================================ destructor TScrollingWinControl.Destroy; begin FHorzScrollBar.Free; FVertScrollBar.Free; inherited Destroy; // *** Desce mais um nível end; ============================================================ destructor TWinControl.Destroy; var I: Integer; Instance: TControl; begin Destroying; if FDockSite then begin FDockSite := False; RegisterDockSite(Self, False); end; FDockManager := nil; FDockClients.Free; if Parent <> nil then RemoveFocus(True); // *** Nada de relevante if FHandle <> 0 then DestroyWindowHandle; // *** Aqui a janela será destruida - via API Windows I := ControlCount; while I <> 0 do begin Instance := Controls[I - 1]; Remove(Instance); // *** Remove - nesta classe Instance.Destroy; // *** uma a um, os componentes são destruidos I := ControlCount; end; FBrush.Free; {$IFDEF LINUX} if FObjectInstance <> nil then WinUtils.FreeObjectInstance(FObjectInstance); {$ENDIF} {$IFDEF MSWINDOWS} if FObjectInstance <> nil then Classes.FreeObjectInstance(FObjectInstance); {$ENDIF} inherited Destroy; end; procedure TWinControl.DestroyWindowHandle; begin Include(FControlState, csDestroyingHandle); try if not Windows.DestroyWindow(FHandle) then // *** Janela destruida RaiseLastOSError; finally Exclude(FControlState, csDestroyingHandle); end; FHandle := 0; end; procedure TWinControl.Remove(AControl: TControl); begin if AControl is TWinControl then begin ListRemove(FTabList, AControl); ListRemove(FWinControls, AControl); end else ListRemove(FControls, AControl); AControl.FParent := nil; end; procedure TWinControl.RemoveControl(AControl: TControl); begin Perform(CM_CONTROLCHANGE, Integer(AControl), Integer(False)); if AControl is TWinControl then with TWinControl(AControl) do begin RemoveFocus(True); DestroyHandle; // *** libera device contexts e destroi a janela end else if HandleAllocated then AControl.InvalidateControl(AControl.Visible, False); Remove(AControl); // *** Remove - nesta classe Perform(CM_CONTROLLISTCHANGE, Integer(AControl), Integer(False)); Realign; end; procedure TWinControl.RemoveFocus(Removing: Boolean); var Form: TCustomForm; begin Form := GetParentForm(Self); if Form <> nil then Form.DefocusControl(Self, Removing); end; ============================================================ destructor TControl.Destroy; begin Application.ControlDestroyed(Self); if (FHostDockSite <> nil) and not (csDestroying in FHostDockSite.ComponentState) then begin FHostDockSite.Perform(CM_UNDOCKCLIENT, 0, Integer(Self)); SetParent(nil); // *** AQUI será desencadeado processo do parent (ver abaixo) Dock(NullDockSite, BoundsRect); FHostDockSite := nil; end else SetParent(nil); // *** AQUI será desencadeado processo do parent ... inherited Destroy; // *** Continua destruindo!!! end; procedure TControl.SetParent(AParent: TWinControl); begin if FParent <> AParent then begin if AParent = Self then raise EInvalidOperation.CreateRes(@SControlParentSetToSelf); if FParent <> nil then FParent.RemoveControl(Self); // *** AQUI o Parent faz algo, chamará o remove do TWinControl if AParent <> nil then begin AParent.InsertControl(Self); UpdateAnchorRules; end; end; end; ============================================================ destructor TComponent.Destroy; begin Destroying; ... DestroyComponents; if FOwner <> nil then FOwner.RemoveComponent(Self); inherited Destroy; end; procedure TComponent.DestroyComponents; var Instance: TComponent; begin while FComponents <> nil do begin Instance := FComponents.Last; if (csFreeNotification in Instance.FComponentState) or (FComponentState * [csDesigning, csInline] = [csDesigning, csInline]) then RemoveComponent(Instance) else Remove(Instance); Instance.Destroy; end; end; procedure TComponent.RemoveComponent(AComponent: TComponent); begin ValidateRename(AComponent, AComponent.FName, ''); Notification(AComponent, opRemove); AComponent.SetReference(False); Remove(AComponent); end; procedure TComponent.Remove(AComponent: TComponent); begin AComponent.FOwner := nil; FComponents.Remove(AComponent); // *** remove da lista de componentes if FComponents.Count = 0 then begin FComponents.Free; FComponents := nil; end; end;
  10. Altere a propriedade Format do TDateTimePicker utilizando a string de formatação conforme mensionada pelo Chur(yyyy-mm-dd) para a função FormatDateTime. Este procedimento irá mudar a aparência do componente na tela apenas. Para obter o texto formatado a partir do conteúdo(data) do TDateTimePicker, proceda conforme o colega Churc orientou. []s
  11. Micheus

    Evento Ontimer

    kmkg, o código abaixo cria o timer ao clicar num botão, com temporização de 3 seg. Ao clicar no botão uma vez, o timer é criado (e já está habilitado), clicando outra vez, ele é eliminado (e já estará desabilitado). Seria este o problema? type TForm1 = class(TForm) ... private DinamicTime :TTimer; procedure TickOfTimer(Sender: TObject); public { Public declarations } end; ... procedure TForm1.TickOfTimer(Sender: TObject); begin Label3.Caption := TimeToStr(Time); end; procedure TForm1.Button9Click(Sender: TObject); begin if not Assigned(DinamicTime) then begin DinamicTime := TTimer.Create(Self); DinamicTime.Interval := 3000; DinamicTime.OnTimer := TickOfTimer; end else begin DinamicTime.Free; DinamicTime := nil; end; end;
  12. Micheus

    True Type Font

    {First load it in the OnCreate event of a form): procedure TForm1.FormCreate(Sender: TObject); begin AddFontResource('c:\FONTS\MyFont.TTF'); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); end; {Before application terminates we must free it:} procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction); begin RemoveFontResource('C:\FONTS\MyFont.TTF'); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); end;Fonte: About.com
  13. Resqüícios do tempo em que utilizando o Borland Pascal for Windows (faz tempo), tinhamos que criar os procedimentos de janela e, com isso, acabavamos por ter que conhecer/entender algunas das principais mensagens do Windows. Com certeza hoje, inda ajuda bastante. As coisas estão mais fávocês hoje em dia. :D []s
  14. Com licença Thales, permita-me um pitaco... Pegando um gancho...Se juntarmos parte do seu código(Thales) e do código inicial do Paulo Nobre, dá para encolher um pouco o código e ter a questão do resize igualzinho como ocorre numa janela com bordas. Considerei uma borda de 2 pixels. A propriedade left e top do Memo1 definem ela, porém, acho que uns 3 ficaria melhor para manipular. No código abaixo, utilizando WM_NCHITTEST do Paulo adaptado, basta mover o cursor até as bordas para visualizar a alteração do cursor e clicar e arrastar para realizar o resize. Já para mover a janela, a parte do código do Thales para este fim continua a mesma, sendo apenas retirada a utilização dos bevels. unit Unit1; interface uses Windows, Messages, Classes, Forms, Controls, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormResize(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } drag : boolean; procedure WMNCHitTest(var Msg: TWMNCHitTest); message WM_NCHitTest; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var off, act : TPoint; begin GetCursorPos(off); dec(off.X,left); dec(off.Y,top); drag:=true; repeat GetCursorPos(act); left:=act.X-off.X; top:=act.Y-off.Y; Application.ProcessMessages; until not(drag); end; procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin drag:=false; end; procedure TForm1.FormCreate(Sender: TObject); begin FormResize(Sender); end; procedure TForm1.FormResize(Sender: TObject); begin Memo1.Width := Width -(Memo1.Left*2); Memo1.Height := Height -(Memo1.Top*2); end; procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); var xPos, yPos :Integer; Flag :byte; begin inherited; Flag := 0; xPos := (Msg.XPos -Left); yPos := (Msg.YPos -Top); if xPos <= Memo1.Left then Flag := $10 else if xPos >= (Memo1.Left +Memo1.Width) then Flag := $01; if yPos <= Memo1.Top then Flag := Flag or $20 else if yPos >= (Memo1.Top +Memo1.Height) then Flag := Flag or $02; case Flag of $10 : Msg.Result := HTLEFT; $01 : Msg.Result := HTRIGHT; $20 : Msg.Result := HTTOP; $02 : Msg.Result := HTBOTTOM; $20 or $10 : Msg.Result := HTTOPLEFT; $20 or $01 : Msg.Result := HTTOPRIGHT; $02 or $10 : Msg.Result := HTBOTTOMLEFT; $02 or $01 : Msg.Result := HTBOTTOMRIGHT; end; end; end. []s
  15. Eu não trabalho com o Rave, mas acho que não é esta a questão do seu problema. Vejamos se consigo lhe ajudar... Parece razoável já que você definiu o DisplayFormat = "hh:nn:ss". Se você observar melhor, verá que o resultado deve ser 1 dia e 1 hora. Tanto que se você mudar DisplayFormat para "dd/mm/yyyy hh:nn:ss", provavelmente perceberá o que estou falando. Vejamos o tipo TDateTime. Na verdade é um float, onde a parte inteira contém a data e a parte fracionária contém a hora. Então quando você soma horas, está falando da parte fracionária, sendo que o acúmulo resultará em um número >= 1, ou seja, com uma parte inteira - neste contexto - data. Não sei se é padrão, mas quando a parte inteira de um campo TDateTime/TDate é 0 (zero) a data retornada é 30/12/1899. Então no seu exemplo, se utilizar a formatação que sugeri anteriormente, você teria como resultado "31/12/1899 01:00:00". Como não conheço o Rave e esse componente CalcText, não tenho muita idéia de como você poderia resolver esse problema. Vamos tentar o seguinte: - Este componente pode lhe retornar um valor float como resultado? Se sim, você não utilizaria a formatação e poderia utilizar este valor para calcular corretamente a quantidade de horas conforme você deseja, ou; - Seria possível você obter este sum direto na sua consulta? Se sim, ele lhe resultaria também num float que de igual forma viabilizaria o cálculo correto. Se você puder obter o valor no formato float (TDateTime/TDate...), você poderia, então, utilizar a função abaixo para apresentar em um "label", no seu relatório, a quantidade de horas no formato esperado - p.e.: "125:30:15" function FullTimeToStr(SUMTime :TDateTime) :string; var StrHora, StrMin :string; TotalHoras :double; begin // aqui você começa a calcular as horas // SUMTime é o total de horas que você obteve na consulta ou do componente // multiplicar por 24 transforma os dias (parte inteira) em horas // já somando com a hora cheia contida na parte fracionária TotalHoras := SUMTime *24; // Formata a hora "cheia", utilizando a parte inteira da variável. // A parte fracionária estará contendo os minutos e segundos StrHora := FormatFloat('##0:', Int(TotalHoras)); // dividimos a parte fracionária (atual) por 24 para obtermos // novamente o formato time. Podemos então utilizar normalmente // a função de formatação para obtermos a fração de tempo restante StrMin := FormatDateTime('nn:ss', Frac(TotalHoras)/24); // Concatenando os resultados Result := StrHora +StrMin; end;
  16. Paulo, troque a propriedade Style do listbox para lbOwnerDrawFixed e escreva o código no evendo OnDrawItem: procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); begin with Control as TListBox do begin if odSelected in State then begin Canvas.Font.Color := clRed; Canvas.Brush.Color := clMenuHighlight end else begin Canvas.Font.Color := clWindowText; Canvas.Brush.Color := clWindow; end; Canvas.FillRect(Rect); Canvas.TextOut(Rect.Left +2, Rect.Top +1, Items[Index]); end; end;
  17. Micheus

    Juntar Tabela

    Acho que é exatamente o que deve ser feito. Aparentemente o relacionamento entre os dois só vai existir em uma consulta. Então ao incluir uma consulta, você atribui o código do cliente e o código do convênio.
  18. Micheus

    Loop No Grid

    Além do que já foi sugerido, dá para comentar um pouco o pedaço de código que você postou: Query1.DisableControls; // evita que o grid seja movimentado Query1.First; // é sempre bom garantir que está no início da consulta while not Query1.EOF do begin if form1.Table1.FindKey([Query1Codigo.value]) then form1.Table1.Delete; Query1.Next; end; Query1.EnableControls; // se for necessário atualizar o grid, terá que fechar e abria a query Query1.Close; Query1.Open;Seu loop deveria ser algo mais ou menos assim. Observe que Table1, deve ter um índice pelo campo Codigo que você pretende utilizar para posicioná-la, e que este deve ser o índice em uso no momento. O campo Codigo a ser passado como parâmetro deve ser proveniente da Query1 já que aparentemente é ela que está ligada ao seu DBGrid.
  19. Micheus

    Gravar Tabela

    Como respondi no outro post, você deveria ter uma tabela que relacionasse ambas. Ela provavelmente terá, pelo menos, os campos codigo do Cliente e código do Convênio. p.s. você pode editar seus posts caso ache que o texto não esteja bom. Tente não criar um post para o mesmo assunto a cada alteração que fizer no texto.
  20. Micheus

    Juntar Tabela

    Normalmente utilizando o campo que os relaciona.A forma como você vai fazer isto no formulário, depende do que você irá colocar nele mostrar estas informações: DBGrid, DBEdit's, DBLockup's ou talvez apenas Edits e você os inicialize na mão. São muitas opções.
  21. Kindelis, só para esclarecer, neste fragmento, FormatFloat não faz nada já que é uma função que retorna o string formatado e você não o atribuiu a nenhuma variável. Ok!? Nestes casos, você utiliza a propriedade DisplayFormat do campo em questão. Basta utilizar o mesmo tipo de string de formatação do FormatFloat - no exemplo: '#0.00'.Se você adiciona os campos ao seu dataset, então acione a lista de campos do dataset para acessar as propriedades do mesmo na janela Object Inspector. Já se não os adiciona, terá que setá-lo em tempo de execução e neste caso, provavelmente você terá que fazer um type-cast porque a propriedade DisplayFormat está presente apenas nos fields descendentes de TNumericField, não em TField que é a classe retornada por Fields. Ex.: - assim não vai dar: qrvendas.Fields.Fields[1].DisplayFormat := '#0.00'; - assim vai dar: -> (qrvendas.Fields.Fields[1] as TFloatField).DisplayFormat := '#0.00', ou ainda; -> TFloatField(qrvendas.Fields.Fields[1]).DisplayFormat := '#0.00'. []s
  22. Se entendi direito, seria utilizando funções, não formatação de campos (TField): FormatFloat('#0.00', Variavel) - esta função formata com pelo menos uma casa antes da vírgua e duas após e aceita inteiro ou real em Variavel; Se desejar que apareça o ponto da milhar use '#,##0.00'. Format('%.2f', [Variavel]) - esta função também formata com duas casas após a vírgura (.2); Não põe o ponto de milhar.
  23. Se o arquivo de áudio for carregado em um Stream, não daria para utilizar a função LoadFromStream de um campo Blob (TBlobField), como é usual utilizar para armazenar imagens?
  24. Micheus

    Consulta Codigo

    Utilize o método locate da query dentro de evento OnChange do Edit. Tem dois post's meus, aqui no forum, que podem ser aproveitados: -> Link1 -> Link2 []s
  25. No evento BeforePrint do sub-detail coloque o código mais ou menos assim: if DatasetNOME_CAMPO_NOTA.Value < 70 then // o dataset e campo que você associou ao QRDBText QRDBText.Font.Color := clRed else QRDBText.Font.Color := clBlack;
×
×
  • Criar Novo...