Ir para conteúdo
Fórum Script Brasil

luizf

Membros
  • Total de itens

    80
  • Registro em

  • Última visita

Tudo que luizf postou

  1. Erro..... A tabela existe, os dados são exibidos normalmente, mas quando clico na titulo da coluna, dá erro. .
  2. E com o exemplo do Douglas Soares, testei com outro parecido, que usa ClientDataSet, troquei neste anterior por uma dica que encontrei na net, mas o erro foi parecido. Com CDS, erro: T+
  3. Pessoal, valeu pela ajuda, mas continua dando erro. Micheus, tentei com seu exemplo, de novo, pois já havia tentando dessa maneira, não sei mas acho que é problema com os numeros, para ordenar, precisar ser string? Erro: O erro, sempre é nessa linha Token. T+
  4. Resolvido. Na minha rotina, tem a seguinte linha: SetLength(NomeArrastado, BufferSize +1); { O +1 é p/ nulo do fim da string } Em outro caso, estava funcionando perfeitamente, mas era pego de um Memo, então acredito que não dava erro, porque entra no mesmo caso do Edit, eu acho. Então só tirei o +1, ficando: SetLength(NomeArrastado, BufferSize); Obrigado
  5. Tentei fazer assim... procedure TForm1.DBGrid1TitleClick(Column: TColumn); var Campo: String; I: Integer; begin Campo:= Column.Fieldname; // Campo recebe o nome da coluna clicada Application.Processmessages; // Para considerar algo que aconteça no dbgrid durante a entrada nesta procedure Query1.SQL.Clear; Query1.SQL.Add('SELECT * FROM ' + ADOTable1.TableName + ' ORDER BY ' + Campo + ' DESC'); if not Query1.Prepared then Query1.Prepare; Query1.Open; end; E continua dando erro.
  6. Não sei o que, e como acontece. Em um dbgrid, usando DragDrop, tenho uma rotina que pega o Path do que esta sendo arrastado e outro que pega o tamanho do Path e adiciona ao banco de dados. O problema é que ao pegar o tamanho esta dando erro por causa desse '#0'. Debugando, percebi que é adicionado ao Path esse #0. Subondo que o Path seja: C:\Teste Ao passar o Path para rotina em forma de String, esta ficando assim: 'C:\Teste'#0 O problema não é com a rotina, sei porque já usei antes e funciona perfeitamente. Por isso tentei fazer o seguinte, ao invés de mandar o Path para rotina, mandei para um Edit e do Edit para rotina, funcionou. Ficando mais ou menos assim: Edit1.Text:= Path; Rotina(Edit1.Text); Mas esse Edit no form coloquei só pra testar, ele não vai ficar lá. O que é esse #0 e como eliminá-lo ou algo parecido? T+
  7. Pois é, já estava colocando no evento OnTitleClick do DBGrid, mas quando clico no titulo trava e dá erro. A ultima mensagem de erro apareceu: Invalid use of keyword. Token: ? Line Number : 1. Onde esta escrito: SQL.Add('select * from Div1 order by ' + Campo + 'ASC' ); Acho que estou errando nesse Div1 e/ou ASC. Não dá pra voce, ou alguém, me passar um exemplo, eu tento mudar para o que preciso. Só pra constar: Os campos (colunas) que quero ordenar, há > coluna com valores reais, > coluna com valores inteiros e > coluna com valores string Não sei se tem diferença pra ordenar, conforme o tipo. T+
  8. Bom, tentei fazer desse jeito, sobre as extensões, mas lembrei, que as vezes em um download e outro, e outras coisas, tem arquivos sem extensão, quando se tem noção do que é voce pode renomear e colocar a extensão correta, numa boa, já acontenceu comigo varias vezer, principalmente com arquivos da faculdade que mandam por email. O quero dizer é o seguinte, como o arquivo em questão não tem extensão, o programa consideraria com pasta e iria causar um erro, certo? Mas com sua dica, acabei tendo uma ideia. Supondo que é um Memo que vai receber o que eu arrastar com o DragDrop. var I: Integer; Tipo: String; TamanhoDir: Extended; begin TotalSizeDir:= 0; TamanhoDir:= 0; for I:= 0 to Memo1.Lines.Count -1 do begin if FileExists(Memo1.Lines.Strings[I]) then begin // Se tipo for arquivo TamanhoDir:= TamArquivo(Memo1.Lines.Strings[I]); Tipo:= 'Arquivo'; end else if DirectoryExists(Memo1.Lines.Strings[I]) then begin // Se tipo for pasta Find(Memo1.Lines.Strings[I]); TamanhoDir:= TotalSize; Tipo:= 'Pasta'; end else // se não encontrar a pasta ou arquivo, então tipo vazio Tipo:= ''; if Tipo <> '' then begin ..... Grava TamanhoDir; Grava Tipo; etc... ..... end; end; Bom, comigo funcionou certinho, se no Memo tinha um arquivo com ou sem extensão, fazia o que era pra fazer com arquivos, pegar tamanho e outros, o mesmo para pasta, e tinha um Path com com nome invalido ou uma linha vazia, não fazia nada. O que acha, por mim caso encerrado. Obrigado pela ajuda. (Resolvido)
  9. Só umas coisinhas que alterei. No Label2 em: Não é Mb, é Kb, mas tudo bem. Então acrescentei, para efeito de teste. Label1.Caption:='Total size = '+formatfloat(',0.00',(TotalSize)) + ' bytes'; Label2.Caption:='Total size = '+formatfloat(',0.00',(TotalSize / 1024)) + ' Kb'; Label3.Caption:='Total size = '+formatfloat(',0.00',(TotalSize / 1024 / 1024)) + ' Mb'; Label4.Caption:='Total size = '+formatfloat(',0.00',(TotalSize / 1024 / 1024 / 1024)) + ' Gb'; O resultado foi: Total size = -1.061.822.231,00 bytes Total size = -1.036.935,77 Kb Total size = -1.012,63 Mb Total size = -0,99 Gb Algo saiu errado, tamanho negativo, e o diretorio que usei para teste tem 99,0 GB. Então lembrei de uma papo a poucos dias em um outro tópico, e troquei o Integer por Extended, ficando assim: var Form1: TForm1; TotalSize: Extended; Com os Labels do mesmo jeito, o resultado foi: Total size = 106.312.360.169,00 bytes Total size = 103.820.664,23 Kb Total size = 101.387,37 Mb Total size = 99,01 Gb Maravilha. Encontrei um programa que tem um exemplo de como pegar o tamanho da pasta, mas pega de um componente visual, e pretendo colocar o código acima em DragDrop. Mas de qualquer forma se puder dar uma olhada. http://delphi.about.com/library/weekly/aa081605a.htm http://delphi.about.com/library/weekly/code/foldersize.zip://http://delphi.about.com/library/wee...dersize.zip Mais uma coisa, com disse vou usar em um DragDrop, ao extrair o Path, como posso verificar se um arquivo ou uma pasta? Quanto ao tamanho do diretório, tudo Ok, obrigado. T+
  10. Como posso obter o tamanho de diretorios em delphi? Há alguma função pronta? Pra tamanho de arquivo, eu achei, mas pra tamanho de diretorio, não. Mas uma coisa, como posso verificar se um Path é um arquivo qualquer ou um diretorio. Supondo que tenho um Memo ao arrastar (DragDrop) o arquivo ou pasta em cima do Memo, ira ser pego o Path e preciso que adicione em um outro memo ou edit qualquer a indicação se é uma pasta ou se é um arquivo. T+
  11. Eu gostaria de ordenar coluna em ordem crescente ou decrescente, achei este codigo na net: var Campo: String; I: Integer; begin Campo:= Column.Fieldname; // Campo recebe o nome da coluna clicada Application.Processmessages; // Para considerar algo que aconteça no dbgrid durante a entrada nesta procedure for I:= 0 to DBGrid1.Columns.Count-1 do DBGrid1.Columns[I].Title.Font.Color := clBlack; with Query1 do begin SQL.Clear; // Limpa a Query SQL.Add('select * from Div1 order by ' + Campo + 'ASC' ); // ESCREVE O SELECT COM O ORDER BY // SELECT * FROM Customers ORDER BY DOB ASC if not Prepared then begin Prepare; Open; // ABRE A QUERY COM A ORDEM ESCOLHIDA. end; end; // with DataModule2.Query_ListaGrav Column.Title.Font.Color:= clBlue; Column.Font.Color:= clBlue; // COLOCAR A COLUNA NA COR DESEJADA end; Mas esta dando erro. E trava o programa. Estou usando um DataSource e um ClientDataSet que salva os dados em um arquivo xml, que fica numa pasta chamada Dados, no diretorio do executavel , por causa desse codigo que achei, adicionei uma Query. Aproveitando o tópico, outra coisa que gostaria, era de exibir ou ocultar linha(s) que possuir uma determinada substring, exemplo. Há uma coluna nomes com os dados (exemplo). ABC - CDX - AGE FGH - KEH - GLV KUI - HUI - ABC Quero ocultar ou excluir as linha que contenham ABC, então a linha 1 e a 3 é ocultada ou exibida, conforme alguma botão clicado ou coisa assim. Obrigado
  12. luizf

    Salvar variavel TForm

    E quando a varialvel para salvar o Form, com posso fazer? Obrigado.
  13. Beleza, agora me dá uma idéia, coloquei um ProgressBar no meu programa, para se ter uma idéia de quanto falta para acabar o processamento. Mas, o resultado de onde é atualizado o ProgressBar, é um valor Extended, então fiz assim: ProgressBar1.Max:= Trunc(ValorExtended); ProgressBar1.Position:= ProgressBar1.Position +1; Com valores pequenos, ou até onde aceita o Position, beleza, mas tem valores em que tem processamento a rodar, mas estourou o inteiro. Que idéia voce me dá para contornar isso? Eu estava pensado em fazer algo como pegar o valor do Extended e usar no ProgressBar1 em escala menor, exemplo. unit Unit1; interface uses...... ...... var DV: Integer; implementation ...... ...... var PosPB: Integer; begin DV:= 2; while ValorExtended > High(Integer) do begin ValorExtended:= ValorExtended / DV; DV:= DV+1; end; ProgressBar1.Max:= Trunc(ValorExtended); end; ...... E para atualizar o ProgressBar. if (Trunc(ValorExtended / DV) ) > ProgressBar1.Position then ProgressBar1.Position:= ProgressBar1.Position +1; O que acha, é possível? Alguma idéia melhor? Obrigado...
  14. luizf

    Salvar variavel TForm

    ========================================================== Mais uma coisa, hoje estava alterando algumas coisas nessa minha biblioteca, e no começo da unit apareceu isso: {$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1} {$MINSTACKSIZE $00004000} {$MAXSTACKSIZE $00100000} {$IMAGEBASE $00400000} {$APPTYPE GUI} {$WARN SYMBOL_DEPRECATED ON} {$WARN SYMBOL_LIBRARY ON} {$WARN SYMBOL_PLATFORM ON} {$WARN UNIT_LIBRARY ON} {$WARN UNIT_PLATFORM ON} {$WARN UNIT_DEPRECATED ON} {$WARN HRESULT_COMPAT ON} {$WARN HIDING_MEMBER ON} {$WARN HIDDEN_VIRTUAL ON} {$WARN GARBAGE ON} {$WARN BOUNDS_ERROR ON} {$WARN ZERO_NIL_COMPAT ON} {$WARN STRING_CONST_TRUNCED ON} {$WARN FOR_LOOP_VAR_VARPAR ON} {$WARN TYPED_CONST_VARPAR ON} {$WARN ASG_TO_TYPED_CONST ON} {$WARN CASE_LABEL_RANGE ON} {$WARN FOR_VARIABLE ON} {$WARN CONSTRUCTING_ABSTRACT ON} {$WARN COMPARISON_FALSE ON} {$WARN COMPARISON_TRUE ON} {$WARN COMPARING_SIGNED_UNSIGNED ON} {$WARN COMBINING_SIGNED_UNSIGNED ON} {$WARN UNSUPPORTED_CONSTRUCT ON} {$WARN FILE_OPEN ON} {$WARN FILE_OPEN_UNITSRC ON} {$WARN BAD_GLOBAL_SYMBOL ON} {$WARN DUPLICATE_CTOR_DTOR ON} {$WARN INVALID_DIRECTIVE ON} {$WARN PACKAGE_NO_LINK ON} {$WARN PACKAGED_THREADVAR ON} {$WARN IMPLICIT_IMPORT ON} {$WARN HPPEMIT_IGNORED ON} {$WARN NO_RETVAL ON} {$WARN USE_BEFORE_DEF ON} {$WARN FOR_LOOP_VAR_UNDEF ON} {$WARN UNIT_NAME_MISMATCH ON} {$WARN NO_CFG_FILE_FOUND ON} {$WARN MESSAGE_DIRECTIVE ON} {$WARN IMPLICIT_VARIANTS ON} {$WARN UNICODE_TO_LOCALE ON} {$WARN LOCALE_TO_UNICODE ON} {$WARN IMAGEBASE_MULTIPLE ON} {$WARN SUSPICIOUS_TYPECAST ON} {$WARN PRIVATE_PROPACCESSOR ON} {$WARN UNSAFE_TYPE OFF} {$WARN UNSAFE_CODE OFF} {$WARN UNSAFE_CAST OFF} Como isso nunca aconteceu comigo, não imagino o que seja. Posso apagar? .
  15. Tenho algumas bibliotecas .pas e para não ficar adicionando linhas em programas/projetos novos, criei e estou criando mais algumas. Então é só declará-las e boa. Mas tem funções que precisam, por exemplo, trocar o Caption do Label1, mas, na biblioteca não posso somente usar: Label1.Caption Tenho de usar: Form1.Label1.Caption Não sei se isso é normal, pois sobre Delphi estou aprendendo sozinho e com ajuda da net. E para quando for fazer algo novo, não ter que ficar trocando todos nomes, tentei fazer o seguinte, na bibioteca, fiz assim: unit U_Biblioteca; interface uses Forms, SysUtils, Classes, StdCtrls, StrUtils; //------ Declaração //------ Procedures e Functions var Formulario: TForm; implementation uses Unit1; //------ Procedures e Functions ...... ...... ...... end. E no form principal, fiz procedure TForm1.FormCreate(Sender: TObject); begin Formulario:= Form1; end; Mas, não reconhece o componente que vem após Formulario, que ficaria assim: Formulario.Label1.Caption:= 'nonono'; Deste jeito, Form1.Label1.Caption, normal. É possivel fazer algo?
  16. Deixa ver se entendi. Quer dizer que quando se usa: max := High(Integer); max irá ocupar o ultimo posição dos inteiros? Se sim, então posso por exemplo usar: var Valor, Max, I, X : Integer; begin ..... ..... X:= xxx; for I:= 0 to X do begin ..... ..... ..... if Valor > Max then Break; end; end; E esse High, pode ser usado para inteiro, real, word, longint,...? Obrigado
  17. No programa que estou fazendo é necessario fazer uns calculos, tanto com numeros reais quanto com inteiros. Quando o valor é muito alto, dá essa mensagem (valor seria o resultado que estourou): 'VALOR' is not a valid integer value Qual o valor maximo que se pode trabalhar com inteiros, e com reais? Há algum jeito de contornar esse erro? Ou como posso tratar esse erro, por exemplo, quando estourar, me retorne o numero máximo que se pode obter e uma mensagem qualquer avisando tal erro. Procurei na net como tratar esse erro, mas todos que encontrei se tratava de divisão por zero e/ou conversão se string vazia para inteiro ou real. Abraço
  18. É o seguinte, gostaria de editar a ultima resposta, a qual fui postar um código e sai com tags html. Tentei postar uma resposta nova, achando que ia dar certo, mas acabou emendando tudo com a resposta anterior, ficou uma caca. Gostaria de edita-la, mas o botão editar aparece em todas respostas minhas, menos na ultima, justa a que preciso editar, pra consertar a caca. Obrigado
  19. Bom, tive um progresso ao meu modo de ver. Dá uma olhada na Unit abaixo. unit U_Fat_Comb; interface uses Forms, SysUtils, Classes, StrUtils, StdCtrls; function CalcFatorial(NumFat: Integer): String; function CalcComb(NumElem, LimInf, LimSup: Integer): String; procedure GeraComb(Taxa: Integer; Elementos, ListaDeRetorno: TStringList; Separador: String); Overload; procedure GeraComb(Taxa: Integer; PegaElemDe, DevolveElemEm: TMemo; Separador: String); Overload; var LOOP: Boolean; implementation //======================================================================= //======================================================================= // Calcula o Fatorial de um numero inteiro positivo // maior que zero e menor que 1755, por causa do limite de Extended function CalcFatorial(NumFat: Integer): String; // NumFat: Valor a ser fatorado var Resp: Extended; I: Integer; begin if NumFat < 1755 then begin if NumFat > 0 then begin Resp:= 1; for I:= NumFat downto 1 do Resp:= Resp * I; Result:= FloatToStr(Resp); end else if NumFat < 0 then Result:= '-1' // -1 = (NumFat não pode ser menor que zero) else Result:= '0'; // 0 = (NumFat não pode ser zero) end else // Número a fatorar, não pode ser maior que 1754 // 1754! = 1,97926189010501E4930 Result:= '-2'; // -2 = (NumFat não pode ser maior que 1755) end; //======================================================================= //======================================================================= { "Denominam-se combinações simples de n elementos distintos tomados k a k (taxa k) aos subconjuntos formados por k elementos distintos escolhidos entre os n elementos dados." } function CalcComb(NumElem, LimInf, LimSup: Integer): String; { Parametros: NumElem: Numero de Elementos LimInf: Limite Inferior LimSup: Limite Superior Obs: Para apenas um calculo, usar mesmo valor para LimInf e LimSup } var I, R: Integer; Elem, Taxa: Extended; begin // Atribui o valor calculado do Fatorial Elem:= StrToFloat( CalcFatorial(NumElem) ); if (NumElem > 0) and (LimInf > 0) then begin Result:= '0'; R:= 0; if NumElem = LimSup then begin LimSup:= LimSup -1; R:= 1; end; for I:= LimInf to LimSup do begin if I = NumElem then Break; Taxa:= StrToFloat( CalcFatorial(I)) * StrToFloat( CalcFatorial(NumElem - I) ); Result:= FloatToStr( Trunc((Elem / Taxa) + StrToFloat(Result)) ); end; if R = 1 then Result:= FloatToStr( StrToFloat (Result) +1); end else Result:= '-1'; end; //======================================================================= //======================================================================= // Gera uma lista das combinações possíves, de n (elementos), k a k (taxa) // A partir de uma lista de Elementos (Elementos) // Devolve uma Lista (ListaDeRetorno) com as combinações procedure GeraComb(Taxa: Integer; Elementos, ListaDeRetorno: TStringList; Separador: String); Overload; { Parametros: Taxa: Numero de Elementos que se deseja para as combinações Elementos: Lista de onde se tira os elementos a combinar ListaDeRetorno: Lista com as combinações resolvidas Separador: Uma string que irá separar um elemento do outro, por exemplo: '-' , para 123 fica 1-2-3 } var ListaIni: TStringList; StrAddLinha, Str: String; I, J, K, W, X: Integer; N: array of Integer; Comb, Total: Extended; begin // Se a Taxa for menor ou igual que o total de elementos, continua if Taxa <= Elementos.Count then begin ListaIni := TStringList.Create; try if Elementos.Count > 1 then begin for I:= 0 to Taxa -2 do begin ListaIni.Add(Elementos[I]); // Cria um Lista Inicial dos elementos, do primeiro end; // até o penultimo elemento possivel no tamanho Taxa // Define o tamanho de N, com o tamanho de ListaIni SetLength (N, ListaIni.Count); for I:= 0 to ListaIni.Count -1 do begin N[I]:= I; // Guarda em N[I], os index iniciais da Lista Inicial, end; // que irão ser incrementados até Elementos.Count // Calcula quantas combinações podem ocorrer Comb:= StrToFloat(CalcComb(Elementos.Count, Taxa, Taxa)); Total:= 0; // Inicia a variavel com zero K:= Taxa; // Inicia a variavel com o valor da Taxa W:= 1; // Inicia a variavel com 2 // Prossegue num loop até Total chegar no numero de // combinações possíves, ou o loop for cancelado while (Total < Comb) and (LOOP = True) do begin if Total > 0 then begin for I:= Taxa -2 downto 0 do begin // Obs. Comparação de N, é para o valor do index if (N[I]+1 <= Elementos.Count - W) and (W = 1) then begin if N[I]+1 < Elementos.Count - W then begin X:= N[I]+1; N[I]:= N[I] +1; // Incrementa os index iniciais ListaIni.Delete(I); //Deleta valor na posição I ListaIni.Insert(I, Elementos.Strings[ N[I] ]); // Insere novo valor, K:= X+2; Break; // Quebra o loop end else begin W:= W +1; // Incrementa W end; end else if ( N[I]+1 < Elementos.Count -W) and ( I < Taxa -2) then begin N[I]:= N[I] +1; ListaIni.Delete(I); ListaIni.Insert(I, Elementos.Strings[ N[I] ]); X:= N[I]+1; for J:= I+1 to Taxa -2 do begin N[J]:= X; ListaIni.Delete(J); ListaIni.Insert(J, Elementos.Strings[ N[J] ]); X:= X + 1; end; K:= X+1; W:= 1; Break; // Quebra o loop end else begin W:= W+1; end; end; // FOR I end; //---------------------------------------------- Str:= ''; // Limpa a variavel // Se houver um separador... if Separador <> '' then for I:= 0 to ListaIni.Count -1 do begin // Cria um String no indice I + o separador Str:= Str + ListaIni.Strings[I] + Separador; end else // senão for I:= 0 to ListaIni.Count -1 do begin // Cria um String no indice I Str:= Str + ListaIni.Strings[I]; end; for I:= K to Elementos.Count do begin StrAddLinha:= Str + Elementos.Strings[I-1]; ListaDeRetorno.Add(StrAddLinha); Total:= Total +1; if Total = Comb then Break; end; //---------------------------------------------- Application.ProcessMessages; end; // WHILE end else begin ListaDeRetorno.AddStrings(Elementos); end; // IF finally FreeAndNil(ListaIni); end; end; end; //======================================================================= //======================================================================= // Gera uma lista das combinações possíves, de n (elementos), k a k (taxa) // A partir de uma lista de Elementos (Elementos) // Devolve uma Lista (ListaDeRetorno) com as combinações procedure GeraComb(Taxa: Integer; PegaElemDe, DevolveElemEm: TMemo; Separador: String); Overload; { Parametros: Taxa: Numero de Elementos que se deseja para as combinações Elementos: Lista de onde se tira os elementos a combinar ListaDeRetorno: Lista com as combinações resolvidas Separador: Uma string que irá separar um elemento do outro, por exemplo: '-' , para 123 fica 1-2-3 } var ListaIni: TStringList; StrAddLinha, Str: String; I, J, K, W, X: Integer; N: array of Integer; Comb, Total: Extended; begin // Se a Taxa for menor ou igual que o total de elementos, continua if Taxa <= PegaElemDe.Lines.Count then begin ListaIni := TStringList.Create; try if PegaElemDe.Lines.Count > 1 then begin for I:= 0 to Taxa -2 do begin ListaIni.Add(PegaElemDe.Lines.Strings[I]); // Cria um Lista Inicial dos elementos, do primeiro end; // até o penultimo elemento possivel no tamanho Taxa // Define o tamanho de N, com o tamanho de ListaIni SetLength (N, ListaIni.Count); for I:= 0 to ListaIni.Count -1 do begin N[I]:= I; // Guarda em N[I], os index iniciais da Lista Inicial, end; // que irão ser incrementados até PegaElemDe.Lines.Count // Calcula quantas combinações podem ocorrer Comb:= StrToFloat(CalcComb(PegaElemDe.Lines.Count, Taxa, Taxa)); Total:= 0; // Inicia a variavel com zero K:= Taxa; // Inicia a variavel com o valor da Taxa W:= 1; // Inicia a variavel com 2 // Prossegue num loop até Total chegar no numero de // combinações possíves, ou o loop for cancelado while (Total < Comb) and (LOOP = True) do begin if Total > 0 then begin for I:= Taxa -2 downto 0 do begin // Obs. Comparação de N, é para o valor do index if (N[I]+1 <= PegaElemDe.Lines.Count - W) and (W = 1) then begin if N[I]+1 < PegaElemDe.Lines.Count - W then begin X:= N[I]+1; N[I]:= N[I] +1; // Incrementa os index iniciais ListaIni.Delete(I); //Deleta valor na posição I ListaIni.Insert(I, PegaElemDe.Lines.Strings[ N[I] ]); // Insere novo valor, K:= X+2; Break; // Quebra o loop end else begin W:= W +1; // Incrementa W end; end else if ( N[I]+1 < PegaElemDe.Lines.Count -W) and ( I < Taxa -2) then begin N[I]:= N[I] +1; ListaIni.Delete(I); ListaIni.Insert(I, PegaElemDe.Lines.Strings[ N[I] ]); X:= N[I]+1; for J:= I+1 to Taxa -2 do begin N[J]:= X; ListaIni.Delete(J); ListaIni.Insert(J, PegaElemDe.Lines.Strings[ N[J] ]); X:= X + 1; end; K:= X+1; W:= 1; Break; // Quebra o loop end else begin W:= W+1; end; end; // FOR I end; //---------------------------------------------- Str:= ''; // Limpa a variavel // Se houver um separador... if Separador <> '' then for I:= 0 to ListaIni.Count -1 do begin // Cria um String no indice I + o separador Str:= Str + ListaIni.Strings[I] + Separador; end else // senão for I:= 0 to ListaIni.Count -1 do begin // Cria um String no indice I Str:= Str + ListaIni.Strings[I]; end; for I:= K to PegaElemDe.Lines.Count do begin StrAddLinha:= Str + PegaElemDe.Lines.Strings[I-1]; DevolveElemEm.Lines.Add(StrAddLinha); Total:= Total +1; if Total = Comb then Break; end; //---------------------------------------------- Application.ProcessMessages; end; // WHILE end else begin DevolveElemEm.Lines.AddStrings(PegaElemDe.Lines); end; // IF finally FreeAndNil(ListaIni); end; end; end; //======================================================================= //======================================================================= end. E para chamar, fiz assim: ... type TForm1 = class(TForm) Btn_Gerar: TSpeedButton; CB_Separador: TCheckBox; Ed_Inferior: TEdit; Ed_Separador: TEdit; Ed_Superior: TEdit; Lb_LstGerada2: TLabel; Me_LstGerada: TMemo; Me_StrFonte: TMemo; ... end; ... ... var Form1: TForm1; implementation uses U_Fat_Comb; {$R *.dfm} ... ... //======================================================================= //======================================================================= procedure TForm1.Btn_GerarClick(Sender: TObject); var L_Inf, L_Sup: Integer; // Limites I: Integer; // contador TamLstFonte: Integer; // Tamanho da lista fonte ListaFonte, ListaGerada: TStringList; // Listas, de envio e retorno Sep: String; // Separador begin if Btn_Gerar.Caption = '&Parar' then begin LOOP:= False; Btn_Gerar.Caption:= '&Gerar'; end else begin LOOP:= True; Btn_Gerar.Caption:= '&Parar'; L_Inf:= StrToInt(Ed_Inferior.Text); L_Sup:= StrToInt(Ed_Superior.Text); ListaFonte := TStringList.Create; ListaGerada := TStringList.Create; try ListaFonte.AddStrings(Me_StrFonte.Lines); TamLstFonte:= ListaFonte.Count; // Tamanho da Lista Fonte for I:= L_Inf to L_Sup do begin // Se Lista Fonte menor que I, quebra o loop if TamLstFonte < I then Break; ListaGerada.Clear; // Limpa a lista de String if CB_Separador.Checked then Sep:= Ed_Separador.Text else Sep:= ''; // Chamada 1 // Demora um pouco mais, acredito que seja por trabalhar com Listas // GeraComb(I, ListaFonte, ListaGerada, Sep); // Chamada 2 // Mais rapida, acredito que seja diretamente com componentes GeraComb(I, Me_StrFonte, Me_LstGerada, Sep); end; // FOR I Me_LstGerada.Lines.AddStrings(ListaGerada); finally FreeAndNil(ListaFonte); FreeAndNil(ListaGerada); end; Lb_LstGerada2.Caption:= IntToStr(Me_LstGerada.Lines.Count); LOOP:= False; Btn_Gerar.Caption:= '&Gerar'; end; end; //======================================================================= //======================================================================= ... ... end. E então?
  20. Descupa, mas se não for abuso, gostaria de pedir se poderia usar comentários nos códigos. Me ajudaria a entender, obrigado.
  21. Usando, Memo1.Lines.Assign(GeraCombinacoes('A-B-CD-E-F-JKL-O', 12)); gerou 70033 combinações. Mas com o sinal '-' seguido e as vezes no final e valor repetido. Por exemplo, na linha 70009 O--O-LF-C--D- Não é a minha intensão complicar, mas eu estava tentando fazer com StringList ao invés de string, pelos seguinte. As combinações que quero gerar, são de index de banco de dados, supondo que eu tenha um banco de dados com 300 index e gere uma string para poder chamar na função acima, ficaria mais ou menos assim: 1-2-3-4-5-...........-298-299-300 Achei numa StringList ficaria melhor e achei que trabalhar com as linhas do StringList acabasse sendo mais facil.
  22. Cara, estou fazendo um balaio de gato aqui. No exemplo, pega os dados de string (S: string). Eu vou precisar pegar os dados de um TStringList, estou tentando adaptar, mas tá meio confuso para mim. //======================================================================= function TForm1.CriaLista(Str, StrIgnora: String): TStringList; // A partir de uma string, cria uma StringList // Excluindo os caracteres referente a StrIgnora var S: String; begin Result := TStringList.Create; try while Str <> '' do begin // enquanto a posição da string a ignorar não for 1 while (Pos(StrIgnora, Str) <> 1) do begin S:= S + Copy(Str,1,1); // vai adicionando a S o primeiro caracter de Str Delete(Str,1,1); // e apagando o primeiro de Str if Str = '' then // se Str tornar vazia quebra o loop Break; end; if (Pos(StrIgnora, Str) = 1) then begin Delete(Str,1,Length(StrIgnora)); // Exclui StrIgnora end; Result.Add(S); S:= ''; end; finally // Result.Free; end; end; // Fim CriaLista //======================================================================= Fiz essa rotina acima, para caso for pegar os dados de um edit. Por exemplo, um edit com os dados: A-B-CD-E-F-JKL-O Chamando com: Memo1.Lines.AddStrings (CriaLista (Edit1.Text, '-' )); Retorna: A B CD E F JKL O Até aqui, tudo bem. ---------------------------------------------------------------------------------------- Mas estou quebrando a cabeça para converter a rotina do exemplo, a trabalhar com TStringList. //======================================================================= function TForm1.GeraCombinacoes(StringFonte: TStringList; Separador: string; NumeroComb: Integer): TStringList; var I, J: Integer; X, Y: string; TS: TStrings; S1: string; begin Result := TStringList.Create; TS := TStringList.Create; try // numero de combinações não pode ser maior que as strings if NumeroComb < StringFonte.Count then begin Result.AddStrings(StringFonte); while Length(Result.Strings[0] < NumeroComb do begin for I := 0 to (Result.Count - 1) do begin S1 := ''; for J := 0 to StringFonte.Count -1 do begin X := StringFonte.ValueFromIndex[J]; if Pos(X, Result.Strings[I]) = 0 then //S1 := S1 + '-' + X; S1 := S1 + X; end; for J := 1 to Length(S1) do begin X := S1[J]; Y := StringFonte[J+1]; TS.Add(Result.Strings[I] + '-' + X + y); end; end; Result.Text := TS.Text; TS.Clear; end; // WHILE end else begin Result.Clear; end; // IF finally TS.Free; ListaTemp.Free; end; end; //======================================================================= Chamando: Memo2.Lines.AddStrings (GeraCombinacoes (Memo1.Lines, '-', 5 )); Esperava que retornasse, algo como: A-B-CD-E-F A-B-CD-E-JKL A-B-CD-E-O A-B-CD-F-JKL A-B-CD-E-O .... .... .... F... O... Mas, quando clico em gerar, dá erro. ---------------------------------------------------------------------------------------- *** Só um pouco de comentário. Desculpa a minha ignorância, mas não sou programador, sou hobbista em delphi, gosto muito de "programar", o pouco que sei, aprendi de curioso, fuçando o próprio delphi, vasculhando com o google (que foi onde encontrei este forum) e com a ajuda deste forum. Mas, não tenho muito tempo de ficar programando por gosto, tenho muito trabalho e também estudo, é mais nas férias da faculdade que dou uns pega, este mesmo se eu não conseguir terminar dentro de mais ou menos 10 dias, vai ficar só pro final do ano, volta as aulas, daí é trabalho e mais trabalho. Mas eu gosto de aprender, aos poucos vou conhecendo mais sobre o delphi. Este programa é para uso pessoal, mas com certeza vou precisar fazer alguma coisa na faculdade, em curso técnico que fiz, fiz um programinha (com a ajuda da net), para enviar sinal pela porta paralela para acionamento de motor, quero tentar fazer agora pela porta usb, mas ainda não tenho material suficiente para isso, e provavelmente na facu terei de fazer algo parecido, mas vai ser em grupo, já ajuda, mas talvez tenha de ser em C. Abraço...
  23. Valeu pela ajuda, vou tentar agora mesmo.
  24. Na verdade, não irei precisar do '-' só na resposta. Preciso de algo mais ou menos assim: var Str, Str1: String; N: Integer; begin N:= IntToStr(Edit1.Text); Str:= '1-5-13-9-10-32'; // caso contrario ficaria 151391032 // ou Str1:= '1-2-3-4-5-6-7-8-9-10-11-12'; // .... 13-14-15... // caso contrario ficaria 12345678910111213 // mas as combinanaçõe tem de ser feita somente com os numeros, 10, 5, 13, 7, etc // Daí Memo1.Lines.Assign(GeraCombinacoes(Str, N)); // para Str ou Str1 end; Para gerar as combinações não usar separadore, somente os numeros, e a resposta usar o separador. Para gerar: 1 2 3 4 ..... 10 11 12 Resposta (5 numeros), por exemplo: 5-8-10-11-12 Dá para fazer com essa mesma rotina?
  25. Pois é, ontem dando uma fuçada na net, a encontrei e ia postar agora pra te mostrar. Mas não gostei dela, demorou muito para gera as combinações, tive até de cancelar o processo. Mas o problema maior,pra mim, não é a demora, é que ela tambem, repete os numeros nas combinações. Exemplo: Na linha 504791, gerou o código: 1 - 7 - 7 - 16 - 16 Um 1, dois 7 e dois 16 Para o problema da demora, pensei que poderia fazer as combinações dando um intervalo para elas. O quero dizer, é o seguinte, não vou usar todas as combinacões, então pra que ficar esperando para gerar, sei lá, mais ou menos 350.000..... combinações. Mas estipular um intervalo, por exemplo. Gerar combinações de 4 index até 8 index, entendeu. Provavelmente as combinações abaixo de 4 de acima 8 não seriam usadas. Então gostei de um outro código que encontrei hoje. Dá uma olhada. function GeraCombinacoes(S: string; NumDig: Integer): TStrings; var I, J: Integer; X: Char; TS: TStrings; S1: string; begin Result := TStringList.Create; TS := TStringList.Create; for I := 1 to Length(S) do Result.Add(S[I]); while Length(Result.Strings[0]) < NumDig do begin for I := 0 to (Result.Count - 1) do begin S1 := ''; for J := 1 to Length(S) do begin X := S[J]; if Pos(X, Result.Strings[I]) = 0 then S1 := S1 + X; end; for J := 1 to Length(S1) do begin X := S1[J]; TS.Add(Result.Strings[I] + X); end; end; Result.Text := TS.Text; TS.Clear; end; TS.Free; end; Para testar: procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Assign(GeraCombinacoes('ABCDEFGHIJKLMNOPQRSTUVWXYZ', 3)); end; Com o teste acima, gerou 15600 combinações, sem repetir item na mesma combinação. Outros exemplos Para um string '123', gerar com 2 digitos, resultou em: 12 13 21 23 31 32 Para um string '123', gerar com 3 digitos, resultou em: 123 132 213 231 312 321 Para um string '1234', gerar com 3 digitos, resultou em: 123 124 132 134 142 143 213 214 231 234 241 243 312 314 321 324 341 342 412 413 421 423 431 432 Para esta rotina, o que preciso é que gere e coloque um separador, por exemplo: Ao invés de mostrar 123, mostrar: 1-2-3, ou 1,2,3 ou 1 - 2 - 3, para quando tiver numero grande, poder diferenciar, se o resultado for: 4358946, poderia ser 43-58-9-46, apenas como exemplo. E tambem, acho que falta ordenar o resultado para comparar se não há repetido, por exemplo, 123 será o mesmo que 321, ou 231, ou 132. Então ordenando 321, esta ficaria 123, podendo comparar. O que achou da rotina melhor que a primeira? Dá pra melhorar?
×
×
  • Criar Novo...