
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
Bom, está longe de um VCLSkin, mas é gratuito e ajuda a dar uma aparência diferenciada ao programa - ver sessão link's este post do Churc Para quem não utiliza componentes data-aware (aqueles vinculados a um datasource): SXSkinComponents (em desenvolvimento e por enquanto pode ser utilizado livremente): TSXSkinButton, TSXSkinCheckBox, TSXSkinEdit, TSXSkinForm, TSXSkinComboBox, TSXSkinImage, TSXSkinLabel, TSXSkinLibrary, TSXStoredSkin, TSXSkinNoteBook, TSXSkinPaintBox, TSXSkinPanel, TSXSkinRadioButton, TSXSkinSpinEdit, TSXSkinUpDown AlphaControls versão Lite (Free) - tem apenas 13 componentes: TsEdit, TsListBox, TsCheckBox, TsGauge, TsPanel, TsButton, TsBitBtn, TsComboBox, TsLabel, TsWebLabel, TsScrollBar, TsSkinManager, TsSkinProvide
-
Bom, na IDE do Delphi tem uma opção para desabilitar o debug integrado (um checkbox "Integrated Debugging"), mas acredito que isto não seja uma boa idéia, já que você não poderá depurar suas aplicações Delphi do modo como o faz (ou seja, não vai mais utilizar os break's, etc.) - não recomendo. Com relação ao registro do Windows, no D7 - chave: HKEY_CURRENT_USER\Software\Borland\Delphi\7.0\Debugging, tem a "variável" ViewCPUOnException que você talvez possa conferir como ela está (marcada = 1 ou desmarcada = 0). Se estiver marcado, então, com a IDE fechada, altere para 0. Acho que esta pode ser uma possibilidade. Na própria IDE, esta opção é marcada/desmarcada, quando uma exception ocorre e a caixa de mensagem de erro do tipo "Debugger Exception Notification" tem marcado o checkbox localizado no canto inferior-esquerdo (na caixa de diálogo) e ao clicar OK (sem tê-lo observado desmarcado), sempre cairá na janela CPU (ver imagem). Veja se não é o que ocorre. Abraços
-
Resposta: não ...o que é ligado ao PrtGrid é o DBgrid não o DatasetEder, acho que você não entendeu o que eu escrevi. Eu disse "PrtGrid utiliza o DataSet ligado ao DBGrid" - acho que é diferente do que você entendeu.Faça o que eu fiz. Voce tem o fonte do tal, então, abra ele e olhe lá na parte em que ele irá imprimir os registros e você verá que ele usa algo como FDBGrid.DataSet.Field[indice].IsVisible para saber se o campo está visível - no Dataset ligado ao DBGrid!!! Resposta: da erro diz que esta fora da faixa quando seleciono no checklist. Fora da faixa é quando você tenta acessar um array com um índice que execede as posições possíveis.Não estou entendendo este erro. Por acaso, você notou que além da nova linha foram adicionados um begin e um end? É que fica parecendo que a última linha (DBGrid1.Columns[idx].Field.Visible) poderia ter sido apenas acrescentada (sem o begin e end), o que resultaria em utilizar um valor de I diferente do esperado. veja que ele fica o visible=false depois imprimi e volta a true fica beleza.. poderia sim. A questão é que ainda acho que a forma anterior deveria funcionar - e ela é mais "simples", digamos assim. Também não estou entendendo qual a finalidade de tratar a finalidade apenas no momento da impressão. Me parece que a impressão deveria refletir o que se está vendo na tela. Então, quando você esconde/mostra a coluna - esconde/mostra o campo do dataset. de qualquer forma, como obter qual o nome do campo a tornar visível/invisível com relação a coluna do DBGrid? Só lembro de um jeito: DBGrid.Columns[indice].FieldName. QUERY1.fieldbyname(DBGrid.Columns[indice].FieldName).VISIBLE:=TRUE;E neste caso, caímos novamente na situação da indexação de Columns... Abraços
-
não seria o caso de você declarar um array onde cada elemento é um registro (record) contendo os campos desejados?
-
Relacionar Uma Tabel De Itens Com Uma Tabela De Orçamentos
uma questão respondeu Micheus em Delphi, Kylix
Robson, só para acertar os termos:- você utilizou o IBConsole para definição das tabelas - e o Interbase é o gerenciador de bando de dados utilizado (não um linkeditor, como nos utilizados com compiladores); Acho que não está não. como você vê, não está muito certo não. Ocorre que para fazer isto, o campo de código do item não pode ser autoincremento - você tem que obtê-lo contabilizando o número total (MAX) de itens para aquele orçamento. A idéia é a mesma colocada neste outro post, contudo, você tem que buscar o MAX do campo código do item baseado no código do orçamento. Seria algo mais ou menos assim: QryMax.SQL.Clear; QryMax.SQL.Add('SELECT MAX(Item_codigo) Item_codigo'); QryMax.SQL.Add('FROM Itens'); QryMax.SQL.Add('WHERE Item_codigodoorcamento = :codigoorcamento'); QryMax.ParamByName('codigoorcamento').AsInteger := <aqui vai o valor de orca_codigo em questão> QryMax.Open; <o novo Item_codigodoorcamento recebe> := QryMax.FieldByName('Item_codigo').AsInteger +1; QryMax.Close; este procedimento você pode colocar no evento BeforePost do dataset Itens, como neste outro post suegestão: sempre que possível, utilize o mesmo nome do campo de relacionamento em ambas as tabelas. Por ex. na de Itens: orca_codigo, item_codigo, Item_total,... na de Orcamento: orca_codigo, ... Abraços -
Ela normalmente aparece apenas para partes do código em que não se possui o seu fonte e, ainda assim, apenas se você estiver tentando depurar chamadas para esses tipos de código (utilizando F7 ou F8). Que eu saiba não tem meio de impedir que isso ocorra. O que pode ser feito é ter o cuidado de, ao depurar o programa, evitar de tentar executar chamadas para procedimentos que não se tenha o código fonte. Nestas situações, o que você pode fazer é posicionar o cursor na próxima linha de código "válida" e teclar F4, quando a execução ocorrerá normalmente até aquele ponto ou adicionar um break-point e teclar F9 para que a execução pare neste ponto e, a partir dali, continua o processo de depuração. É como faço. Inclusive, quando eventualmente a deixo aparecer, eu a fecho e forço a execução até um ponto previsto (utilizando os procedimentos mencionados acima). Abraços
-
Eu imprimo as consultas através do QuickReport. Como você adicionou os fields no seu DBGrid, então você está trabalhando com a propriedade Visible destas colunas, certo?!Pois é, o tal do PrtGrid utiliza o DataSet ligado ao DBGrid, então para satisfazer suas necessidades (a dele) basta que além de trabalhar com a visibilidade da coluna, você trabalhe também com a do campo no dataset. Isto deve resolver: procedure TForm1.Button1Click(Sender: TObject); Var I : Integer; begin for I := 0 to CheckListBox1.Count - 1 do begin DBGrid1.Columns[i].Visible := CheckListBox1.Checked[I]; DBGrid1.Columns[i].Field.Visible := DBGrid1.Columns[i].Visible; end; end;Observe que a propriedade Field corresponde exatamente ao campo lá no seu dataset. Então, talvez seja conveniente você marcar, na lista de fields do seu dataset, os campos que não irão aparecer nunca no seu DBGrid com Visible=False. Assim, você não corre o risco de ter algum outro campo impresso - além daqueles que estão adicionados ao seu DBGrid. Testa aí...
-
Já deu uma olhada na sessão Apostilas Gratuitas do forum? (tem um botão lá no topo da página) Mas para adiantar, segue o link para as apostilas de Access Dê uma olhada no site Apostilando.com - você tem que se cadastrar, mas vale a pena.
-
Eu fiz um programa utilizando o Skin, com PageControl onde o "miolo" (digamos assim) fica conforme a skin (apenas a guia é que mantém a borda superior conforme o tema do XP). Eu tenho um componente TSkinData no form principal, com a propriedade SkinFormType = sfMainForm; todas as opções da propriedade SkinControls marcadas com True; a propriedade Options marcada apenas xoToolBarBK com True; A versão que utilizei foi a 4.11.06.25 Na pior das hipóteses, você pode tentar utilizar a propriedade Skin3rd para "dizer" que o TPageControl ou TTabSheet é igual a um panel, por exemplo. Vai que funciona... :huh:
-
não quero estragar sua alegria não, mas você tem que utilizar o conteúdo da variável para o qual você criou (alocou) a instância da classe TForm2, neste caso Form, não a variável Form2 declarada globalmente na unit aonde o form está. ;) nesta parte, você provavelmente terá problemas. Veja o que o help diz sobre property MDIChildren[i: Integer]: TForm; The order of MDI children changes as different MDI forms are activated. Initially, forms are listed in creation order, with new forms being added to the end of the array. Whenever an MDI child is activated, however, it moves to the front of the list. Thus, use I to index over all forms in the array, but not to refer to a specific form. Aliás, talvez resida justamente aí o seu problema. Verifique um dos efeitos: Crie umas 5 janelas, depois feche o 1º e 2º form's criados; clique nos botões que sobraram, e ... Ao clicar num botão com a tag = 3 ou 4 você não vai conseguir posicionar com MDIChildren[(Sender as TBitBtn).Tag].Show sem que obtenha erro, porque você estourará o índice! (só existem 3 forms: 0, 1, 2); De forma similar, você pode estar clicando num botão com tag = 2 mas como a ordem na lista MDIChildren muda conforme as janelas recebem o foco, depois de algumas mudanças de janelas, não há qualquer garantia de que MDIChildren[2] refere-se realmente ao 3º fom criado. A solução é verificar na lista de janelas disponíveis (abertas), qual é exatamente aquela associada ao botão, certo?! Uma coisa é fato: tem que percorrer a lista de janelas filhas! Então, percorrendo esta lista, temos algumas opções para verificar quem-é-quem: 1) na criação do form, você utiliza a propriedade Tag do mesmo para guardar o valor atribuído à tag do botão e, então, testa ambas as Tag's; if MDIChildren[I].Tag = (Sender as TBitBtn).Tag then 2) na criação do form, você anexa ao nome do mesmo o valor atribuído à tag do botão - tipo FormChild1, FormChild2,... - e testa pelo nome no formato utilizado na criação; if MDIChildren[I].Name = 'FormChild'+IntToStr((Sender as TBitBtn).Tag+1) then 3) como na criação do botão, você atribui a ele o Form como Owner, então, você testa por esta condição; if MDIChildren[I] = (Sender as TBitBtn).Owner then a procedure completa para o caso 3:procedure TForm1.Clique(Sender: TObject); var I :Integer; begin for I := 0 to Self.MDIChildCount -1 do if MDIChildren[I] = (Sender as TBitBtn).Owner then MDIChildren[I].Show; end; Confira o que eu postei aqui (vai que estou falando abobrinha...) e teste.
-
Robinho, primeiramente, informo que juntei os dois tópicos que você criou por tratarem sobre o mesmo assunto. Dê preferência a postar informações complementares no tópico inicial, ok?! Bom, você não mencionou que tipo de componentes utiliza (se são os da paleta BDE, InterBase, ZeosLib ou outro), então, vou tratar simplesmente como dataset (de onde todos são derivados). Você também não disse como as tabelas estão relacionadas, então vou exemplificar como mostrar/editar em um DBGrid uma tabela onde temos as seguintes colunas: Data, Horario, Aluno, Carro, Instrutor; já que imagino isto seria a tal grade de programação das aulas práticas. Vejamos se estes itens lhe ajudam: - Sugiro que para a grade, você utilize um dataset do tipo table ligado a um DBGrid (via datasource, é claro); - Precisaremos de um dataset do tipo query para consultar cada tabela referenciada (Aluno, Carro, Instrutor) onde, em cada uma, deverá ser incluso na cláusula SELECT o campo de referência e o campo de descrição (p.e., Nome e Placa); - Agora, no dataset principal, faremos a referência a estes dataset's de consulta (lookup); Para isso, em design-time, acesse a lista de campos do dataset principal (duplo click no componente); Agora, adicione um novo campo (botão direito -> New field...); Em Name, vamos definir NomeAluno, seguido por Type igual a String e Size conforme definido o referido campo na sua tabela de alunos; A seguir, definimos o tipo deste campo como sendo Lookup; Mais abaixo, fazemos a vinculação à consulta definindo KeyFields com o campo de referência a tabela alunos, DataSet apontando para a consulta à alunos, em Lookup Keys selecionamos o campo referenciado e em Result Field selecionamos o campo a ser apresentado no DBGrid; - O procedimento anterior deverá ser repetido para todos os campos que serão obtidos via lista de seleção no DBGrid (Aluno, Carro e Instrutor); - Ao DBGrid, são então adicionados os campos Data, Hora, seguido dos que foram criados como Lookup (não os "nativos"); Obs: 1) Antes de o dataset principal ser aberto, as consultas lookup's já devem estar abertas; 2) Se alguma alteração for realizada nas tabelas utilizadas como lookup neste DBGrid, as respectivas consultas tem que ser atualizadas (close e open); Tenho a impressão que isto vai responder uma parte do que você precisa. Na pior das hipóteses, teste e veja o efeito. Verifique e qualquer coisa, questione. Abraços
-
Churc, acho que esse poderia ser o próximo erro. :rolleyes: Eu explico. Com certeza motivo da mensagem é a não existência de um parâmetro com o nome d1 e d2, é verdade. Mas, mesmo que fosse corrigido o nome dos parâmetros em ParamByName, ainda teríamos a mesma mensagem (com os novos nomes, é claro). Isto ocorreria pelo fato de a consulta não estar devidamente preparada para receber as datas como parâmetro (a utilização do ":"). ;) Então, Pirambú!, além do que o Churc mencionou, acrescente os ":" conforme segue: dmDados.qMovimento.SQL.Add('where nomefor = :nome and Datas between :Dt1 and :Dt2 '); Abraços
-
Acredito que não seja uma questão de "case sensitive", mas nada impede que seja feita a conversão para minúscula ou maiúscula. Chur, essa é uma boa obsevação. Como é um componente de terceiro, nada impede que ele tenha sido programado de uma forma um pouco diferente do que se está acostumado. A pergunta é: fajo, no seu form, onde ficam as declarações dos componentes adicionados a ele, existe alguma referência a componentes do tipo TRzGroupItem?
-
Churc esse lance do utilizar a Tag seria uma saída, mas o colega fajo já utiliza esta propriedade para outra finalidade. A questão de erro no teste: If (Form.Components Is TRzGroupItem) Then pode ser contornada através da verificação via método ClassName: If (Form.Components.ClassName = 'TRzGroupItem') Then Depois, o type-cast é desse jeito mesmo que você colocou: TRzGroupItem(Form.Components)....
-
É estranho mesmo, porque eu utilizo sem problemas. Só para desencardo de conciência, você já teclou F1 sobre este componente para ver se na versão 4, este campo por acaso estaria em outro lugar (tipo algo como Items.Count) ou com outro nome? Outra coisa, já que você pegou o código de um colega, faça então um favor a lógica: troque pelo código abaixo procedure TForm1.Button1Click(Sender: TObject); Var I : Integer; begin for I := 0 to CheckListBox1.Count - 1 do DBGrid1.Columns[i].Visible := CheckListBox1.Checked[I]; end; Esse negócio de fazer: if TRUE then TRUE else FALSE me dá arrepios.... <_<
-
vms, acho que seriam estas etapas: - no form1 declare uma variável local (em private) do tipo boolean; - no form2 crie um método que obtenha um retorno indicando que o form deva ou não ser mostrado numa próxima vez; Este método é responsável por mostrar o form e retornar o valor do checkbox; - no form1 você testa a variável booleana para ver se vai ou não mostrar o form2. no Form1: type TForm1 = class(TForm) ... private ShowForm2 :Boolean; ... end; ... procedure TForm1.Form1Create(Sender :TObject); begin ShowForm2 := True; ... end; procedure TForm1.BtnShowForm(Sender :TObject); begin // mostrará o Form2 apenas se variável for verdadeira if ShowForm2 then begin Form2 := TForm2.Create(Slef); try ShowForm2 := Form2.ShowForm; // se o cara desmarcar, então na próxima vez ShowForm2 será false finally Form2.Free; end; end; Form3 := TForm3.Create(Slef); try Form3.ShowModal; finally Form3.Free; end; end; no Form2: type TForm2 = class(TForm) public function ShowForm :Boolean; end; ... function TForm2.ShowForm :Boolean; begin ShowModal; // mostra o form de advertência Result := cbMostraForm.Checked; // retorna a condição para a próxima vez end; você também pode gravar a informação da variável no registro ou arquivo de inicialização para recuperar quando o programa iniciar Abraços
-
File Is Locked-2 Usuarios Tentado Visualizar O Mesmo Relatorio
uma questão respondeu Micheus em Delphi, Kylix
Faltou o mais importante...Com que banco de dados você está trabalhando? Neste relatório você está fazendo alguma atualização nas tabelas? Neste relatório você está utilizando dataset do tipo Tables ou Queries? -
Só um adendo ao que o Pirambú! colocou... Para evitar que a linha selecionada no DBGrid se movimente (gerando até um scroll) enquanto você contabiliza o valor total, antes de abrir a consulta (.Open) chame o método DisableControls do seu dataset (a query). Siga com o While para a totalização e, ao término, chame o método First para reposicionar novamente no início da sua consulta e chame o método EnableControls para que seu DBGrid seja atualizado e os controles ligados ao dataset tenham sua funcionalidade restabelecida.
-
[resolvido] Ocultar Determinado Registro Na Apresentacao Do Relatorio
uma questão respondeu Micheus em Delphi, Kylix
você pode, através do evento BeforePrint da banda Detail, impedir sua impressão atribuindo False para o parâmetro PrintBand.Se eu não estiver enganado, isto deve resolver seu problema. -
jo_user, você copiou e colou aqui o código exatamente como você o tem no programa?Se a resposta for sim, então o problema reside na falta dos parenteses finais na linha do insert e do values, dentro do string do comando - não o do Delphi, é claro. Churc, sinto lhe informar, mas a segunda opção é verdadeira. :rolleyes: O tipo numeric é declarado no banco de dados da seguinte forma NUMERIC(I, D). Dando uma pesquisada para me certificar (faz tempo que trabalhei com o SQLServer), verifiquei que existe também o tipo DECIMAL que, aparentemente, deve ser preferido ao primeiro: "DECIMAL(I,D) e NUMERIC(I,D): Armazenam valores numéricos inteiros com casas decimais utilizando precisão. I deve ser substituído pela quantidade de dígitos total do número e D deve ser substituído pela quantidade de dígitos da parte decimal (após a vírgula). DECIMAL e NUMERIC possuem a mesma funcionalidade, porém DECIMAL faz parte do padrão ANSI e NUMERIC é mantido por compatibilidade. Por exemplo, DECIMAL(8,2) armazena valores numéricos decimais variando de – 999999,99 até 999999,99" Abraços
-
Informe o banco de dados utilizado.
-
Mas isso é o padrão para todos os aplicativos que ficam na Tray - pelo menos os que eu conheço. O botão esquerdo é utilizado apenas no duplo-click para ativar a aplicação (normalmente, depende de como foi programado). O componente utiliza a metodologia padrão. Se você quer fazer diferente, vai ter que abandonar o uso do componente e escrever o código na mão (não é muito complicado não). Neste post tem o código básico. Entretanto, como ao clicar no "X" para fechar o que fazemos é esconder o form (Hide), então faltou apenas um controle de quando queremos realmente fechar a aplicação - tipo utilizando uma opção do menu "Sair Alt+F4". Vamos também, incluir a sua opção para manipular o botão esquerdo. Utilize, então, o código naquele post e faça os ajustes seguintes. Inicialmente, crie uma variável na sessão Private do seu form: private FPodeFechar :Boolean; // *** Acrescentar ... depois, inicialize ela no evento OnCreate:procedure TForm1.FormCreate(Sender: TObject); var NotifyIconData: TNotifyIconData; begin FPodeFechar := False; // *** Acrescentar Application.ShowMainForm := False; ... altere o manipulador de evento na Tray para que possa manipular, além do click-direito, o click-esquerdo:procedure TForm1.WMTrayIcon(var Msg: TMessage); var Pt: TPoint; begin case Msg.lParam of WM_RBUTTONDOWN, // responde ao click do botão direito e WM_LBUTTONDOWN : // esquerdo begin GetCursorPos(Pt); // obtém a posição do cursor sobre o ícone na Tray PopupMenu1.Popup(Pt.X,Pt.Y); // Mostra o menu pop-up end; WM_LBUTTONDBLCLK : // no duplo-click mostra a janela principal Show; end; end; para corrigir a questão do fechamento da aplicação alteramos o evento OnClose para:procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if not FPodeFechar then // enquanto você não liberar, a aplicação não encerra!!! begin Action := caNone; Hide; end; end; seguido pela opção do menu que fechará a aplicação efetivamente. O evento OnClick da opção Sair do menu pop-up:procedure TForm1.Sair1Click(Sender: TObject); begin FPodeFechar := True; Close; end; O básico é isso. Mas tem apenas mais um probleminha ainda. Quando o Windows for encerrado e sua aplicação estiver minimizada, nesta configuração, ele não conseguirá encerrar a sessão. Para isso, tem mais uma mensagem a ser verificada. Dê uma olhada neste outro post. Abraços
-
Database Server Error: I/o Error For File "c:\windows\temp\fb_sor
uma questão respondeu Micheus em Delphi, Kylix
Lalla, este é mesmo um tópico para o forum de Banco de dados (você até postou lá também) Em todos os casos, vou dar uns chutes... Sabendo que o arquivo em questão é um arquivo criado temporariamente, o que vem a mente quanto lemos: 1) "Isso só aparece quando há várias páginas a serem impressas no relatorio. Se forem poucas páginas, não aparece." 2) "Isso acontece também nos objetos DBGrid (Delphi) dos aplicativos quando há mtos dados a serem exibidos." Eu diria falta de espaço em disco para geração do arquivo temporário. Se for, isto poderia ocorrer: 1) por falta de espaço no HD do servidor para acomodar o arquivo temporário. Neste caso, é fácil verificar nas propriedades do HD, aonde está a pasta temporária utilizada pelo servidor FireBird, o espaço disponível (ainda que haja algum espaço, há de levar em conta quanto espaço a consulta deverá consumir. Talvez ao executá-la e obter o erro, seja possível neste momento, observar que o espaço é mínimo). Se não foi definido um local específico para os arquivos temporários do Firebird (o que é definido no arquivo Firebird.conf onde aparece o texto TempDirectories = - localizado na pasta de instalação do servidor) então é utilizada a pasta temporária padrão do sistema. 2) por restrição de cota ou algo assim. Esta mensagem está incompleta: deve ter algo além das "..." (provavelmente um número) e a parte em português parece ter sido traduzida - o ideal é postar a mensagem completa, como aparece. -
Então, já olhou o seu outro post? Já coloquei lá qual propriedades utilizar.
-
Sugestão: troque o TTabbedNotebook (antigo, da versão 16bits do windows - 3.1) pelo PageControl (versão 32bits, mais atual)