
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
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
-
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
-
Como Usar A Caixa De Pesquisar Para Pesquisar Em Um Memo?
pergunta respondeu ao D4n1l0d de Micheus em Delphi, Kylix
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 -
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
-
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
-
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.
-
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
-
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;
-
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;
-
Como Alterar O Formato Do Datetimepicke?
pergunta respondeu ao smallkayo de Micheus em Delphi, Kylix
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 -
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;
-
{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
-
Procedure Tfrmprincipal.wmnchittest(var Msg: Twmnchittest);
pergunta respondeu ao Paulo Nobre de Micheus em Delphi, Kylix
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 -
Procedure Tfrmprincipal.wmnchittest(var Msg: Twmnchittest);
pergunta respondeu ao Paulo Nobre de Micheus em Delphi, Kylix
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 -
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;
-
(Resolvido) Destacar Linha De Um Listbox Com Uma Cor.
pergunta respondeu ao Paulo Nobre de Micheus em Delphi, Kylix
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; -
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.
-
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.
-
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.
-
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.
-
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
-
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.
-
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?
-
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
-
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;