Post on 16-Dec-2018
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 1 -
EDITOR DE TEXTOS SIMPLES
1. OBJETIVO: Neste programa iremos demonstrar o uso dos objetos Memo1 onde os
textos são digitados, dos diálogos: OpenDialog, SaveDialog, FontDialog e FindDialog, além do MainMenu para a criação do menu principal. Serão utilizados alguns comandos para seleção de textos e manipulação de strings. Utilizaremos o MessageBoxEx para questionar o usuário. Utilizaremos o evento OnClose, assim como o método Abort deste evento. Neste programa ainda mostraremos a utilização de múltiplos formulários, um deles será o AboutBox (Sobre) que é utilizado para identificar o programa e seus autores; e um formulário de impressão (QRListForm).
2. Altere a propriedade Caption do formulário Form1 para:
Caption à Editor de textos – SemNome.txt 3. Acrescente ao formulário um objeto Memo, que se encontra na aba Standard. E
altere as seguintes propriedades do mesmo: propriedade valor Descrição
Align alClient
Escolhemos de que forma o objeto ficará alinhado em relação ao formulário. Poderá ser no topo, no rodapé, a esquerda, a direita, ou em toda área “client” do formulário (opção que foi escolhida) e finalmente nenhum alinhamento.
Lines “Deixar em branco” Aqui são armazenadas todas as linhas digitadas no objeto Memo.
ScroolBars ssBoth
Escolhe-se aqui a forma que aparecerão as barras de rolagem: nenhuma barra, ou somente a barra vertical, ou somente a horizontal ou ambas (opção escolhida).
4. Agora, acrescente um objeto
MainMenu, que se encontra na aba Standard. Ele não é visual, ele apenas permite a criação de um menu situado na parte superior do formulário.
5. Dê um duplo clique sobre o objeto
MainMenu1, o que fará surgir a tela da figura ao lado:
6. No retângulo tracejado de fundo azul, que aparece, é o local onde iremos inserir a
primeira palavra de acesso. Se você digitar a palavra &Arquivo, este texto será
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 2 -
colocado na propriedade caption de um novo objeto que será criado com o nome do texto digitado, retirando os caracteres especiais (caracteres diferentes de letra, e caracteres acentuados), seguido de um algarismo que irá numerar os objetos que porventura tenham o mesmo nome. Neste caso, o nome do objeto será Arquivo1.
7. Você deve ter observado que antes da palavra Arquivo colocamos o símbolo &
(ampersand). Sempre inserimos este símbolo no caption dos objetos quando queremos que a letra seguinte seja sublinhada. O fato de se sublinhar uma letra, possibilita que a mesma sendo digitada juntamente com a tecla [Alt] sirva de um “atalho” para o comando, isto é, no caso de não possuirmos mouse, ou o usuário não quiser fazer uso do mesmo, bastará digitar [Alt] [A] e tudo ocorrerá como se ele tivesse “clicado” na palavra Arquivo do menu.
8. Agora, com o auxílio das
setas de direção do teclado, insira as demais palavras, observando qual letra deverá ser sublinhada:
9. Volte até à palavra
Arquivo, e acrescente, agora no sentido vertical, as palavras que aparecem na figura, observando ainda as letras que estão sublinhadas:
10. Observe que coloca-
mos uma linha hori-zontal acima da palavra Sair. Isto foi conseguido digitando apenas um hífen no caption do objeto e em seguida acionando a tecla [enter].
11. Passe agora para a
palavra Edição e digite as opções. A palavra F3 que aparece no menu não deve ser digitada:
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 3 -
12. A palavra F3 que aparece no menu, representa um atalho para aquela opção (Localizar Próxima). Este atalho é programado através da alteração da propriedade ShortCut do objeto recém criado LocalizarPrxima1. Ao clicar nesta propriedade no Object Inspector você terá inúmeras opções, dentre elas você encontrará a tecla F3.
13. Passe agora para a
opção Impressão e digite as palavras:
14. A opção Sobre não
terá nenhuma palavra a ela submetida. Esta opção será única.
15. Pronto. Agora
feche esta janela, clicando no botão [X] da mesma.
16. Acrescente agora os seguintes objetos NÃO VISUAIS, alterando as propriedades
enumeradas:
a) OpenDialog, encontrado na aba Dialogs:
Propriedades Valores Descrições
DefaultExt txt Especificando a extensão padrão, não existirá a necessidade de digitá-la ao escrevermos o nome do arquivo no diálogo.
Filter
Arquivo texto *.txt Só irão aparecer os arquivos com o filtro
escolhido: ou com extensão txt ou todos os arquivos. Todos os
arquivos *.*
Title Abrir arquivo Texto que aparecerá na faixa superior da caixa de diálogo (caption).
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 4 -
b) SaveDialog, encontrado na aba Dialogs:
Propriedades Valores Descrições
DefaultExt txt Especificando a extensão padrão, não existirá a necessidade de digitá-la ao escrevermos o nome do arquivo no diálogo.
Filter
Arquivo texto *.txt Só irão aparecer os arquivos com o filtro
escolhido: ou com extensão txt ou todos os arquivos. Todos os
arquivos *.*
Title Gravar arquivo Texto que aparecerá na faixa superior da caixa de diálogo (caption).
c) FontDialog, encontrado na aba Dialogs:
Propriedades Valores Descrições
Device fdBoth Escolhe-se onde a fonte vai atuar: somente na tela (fdScreen) ou somente na impressora (fdPrinter) ou em ambos (fdBoth).
d) FindDialog, encontrado na aba Dialogs:
Propriedades Valores Descrições
Options
frHideMatchCase = true Esconde a opção de escolher procura considerando ou não letras maiúsculas
FrHideWholeWord = true Esconde a opção de coincidir ou não a palavra inteira
FrHideUpDown = true Esconde a opção de escolher o sentido da busca: para cima ou para baixo
17. Todos os objetos de diálogo, são executados à partir do método execute colocado
logo após o nome do mesmo. Este método é uma função booleana que retorna verdadeiro (true) toda vez que o usuário escolhe uma opção e retorna false, caso o usuário cancele o mesmo.
If Opendialog1.execute then ... If SaveDialog1.execute then ... If FindDialog1.execute then ... If FontDialog1.execute then ...
18. Agora, passemos à programação propriamente dita: a) Comando Novo (opção do menu principal): dê um clique na palavra Novo do menu.
Ao fazer isto, surgirá o método do evento OnClick do novo objeto Novo1: procedure TForm1.Novo1Click(Sender: TObject); begin end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 5 -
Digite as linhas que aparecem em negrito: procedure TForm1.Novo1Click(Sender: TObject); begin If not DirectoryExists('C:\Meus documentos') then MkDir('C:\Meus documentos'); Arquivo:= 'C:\Meus documentos\SemNome.txt'; Memo1.lines.clear; Titulo; end;
• Utilizamos o comando If para verificar a existência da pasta Meus documentos na raiz do drive C. Para isto, empregamos a função DirectoryExists(‘nome do diretório’) que retornará true se o diretório especificado existir.
• Caso o diretório não exista, será chamada a rotina MkDir(‘nome do diretório’), cuja função é a de criar esta pasta.
• Na linha seguinte, atribuímos a uma variável de nome Arquivo o nome do arquivo inicial (SemNome.txt), juntamente com o seu caminho. Esta variável deverá ser declarada globalmente (o melhor local, é juntamente com a variável Form1, da seguinte forma:
• Em seguida, “limpamos” o texto de todas as linhas do objeto Memo1, através
do método Clear. • Finalmente, invocamos a rotina Titulo. Esta rotina, nós teremos que escreve-
la, pois, não se trata de nenhum método ligado a qualquer evento, portanto, o Delphi não a criará, a menos que providenciemos isto:
ü Vá até a região da Unit1 onde se encontra a declaração do objeto Form1
e acrescente na cláusula public o título da procedure de nome Titulo. Nesta cláusula são colocadas as declarações de rotinas que poderão ser executadas por todas as Units do projeto. Veja o que está em negrito:
unit Unit1; : : : : : : private { Private declarations } public procedure Titulo; end;
var Form1: TForm1; Arquivo: string; implementation
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 6 -
ü Agora, mantendo o cursor de texto localizado na linha da declaração desta procedure, acione simultaneamente as teclas: [Ctrl] [Shift] e [C]. Ao fazê-lo, o Delphi irá acrescentar no final da Unit1 a procedure correspondente a esta declaração:
ü Digite a linha que aparece em negrito:
ü A linha digitada, faz a concatenação (justaposição) de dois strings
(textos) que são colocados na propriedade caption do objeto Form1. Um destes strings é representado pela constante ‘Editor de textos – ‘ e o outro é obtido da variável Arquivo, extraindo-se da mesma somente o nome do arquivo, sendo eliminado o caminho (path) do mesmo. Esta extração, é conseguida através da função do Delphi de nome ExtractFileName(‘nome do arquivo’). Portanto, se a variável Arquivo contiver o seguinte texto: C:\HomePages\Textos\Carta.txt, a propriedade Caption do formulário será: Editor de textos – Carta.txt
ü A chamada à rotina Titulo irá simplificar em termos de digitação, pois,
deverá ser chamada em vários locais do programa. Ao ser chamada, o nome do arquivo que está aberto será colocado na faixa superior do formulário (caption).
: : : : : : procedure TForm1.Titulo; begin end; end.
: : : : : : procedure TForm1.Titulo; begin Form1.caption:= 'Editor de textos - ' + ExtractFileName(arquivo); end; end.
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 7 -
b) Ao iniciar o programa: Como sabemos, o primeiro evento programável que é executado quando um programa se inicia é o OnCreate do formulário principal (Form1). É no método deste evento que devemos incluir uma chamada ao menu Arquivo à Novo (automaticamente) para que o programa assuma o nome do arquivo “SemNome.txt” e fique pronto para receber um novo texto:
procedure TForm1.FormCreate(Sender: TObject); begin Novo1Click(Sender); end;
c) Comando Abrir (opção do menu principal): ele irá abrir um diálogo de abertura de
arquivos (OpenDialog) para que o usuário escolha o arquivo que deseja visualizar na área do editor. Clicando na palavra Abrir do Menu principal, abrir-se-á o método do evento Onclick do objeto Abrir1, onde você deverá digitar as linhas que aparecem em negrito:
• O teste If que aparece na primeira linha é utilizado para verificarmos se o usuário escolheu ou não um arquivo no diálogo. O método execute faz surgir
o diálogo de abertura de arquivos, que terá o seguinte aspecto:
Texto colocado na propriedade Title
Texto colocado na propriedade Filter
Só aparecem arquivos contendo a extensão txt.
procedure TForm1.Abrir1Click(Sender: TObject); begin If OpenDialog1.execute then begin Arquivo:= OpenDialog1.filename; Memo1.Lines.LoadFromFile(arquivo); Titulo; end; end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 8 -
• Se o usuário escolher algum arquivo, o caminho mais o nome do mesmo, ficará guardado na propriedade filename do objeto OpenDialog1. Por esta razão, incluímos a linha de comando que transfere para a variável Arquivo o conteúdo desta propriedade.
• Em seguida, empregamos o método LoadFromFile(‘nome do arquivo’) da propriedade Lines do objeto Memo1, para carregar nas linhas deste objeto os dados contidos no arquivo cujo nome e caminho está guardado na variável Arquivo.
• Finalmente, invocamos novamente a rotina Titulo que irá atualizar o nome do arquivo lido no topo do formulário do nosso Editor.
• Repare que estes comandos só serão executados se o usuário escolher um arquivo. Caso ele não escolha nenhum arquivo, ou seja, ele cancele a operação, a função execute retornará o valor false que impedirá a execução dos comandos situados no escopo do comando If.
d) Comando Salvar Como (opção do menu principal): Saltamos propositadamente o
comando Salvar do menu, pois, ele é mais simples e quando requerer a alteração do arquivo, iremos chamar a rotina SalvarComo1click. Esta rotina deverá ficar assim (ver comandos em negrito):
• Primeiramente, atribuímos à propriedade filename do objeto SaveDialog1 o
nome atual do arquivo, para que ao abrir o diálogo, já apareça um nome na caixa correspondente ao nome do arquivo desejado. (veja na figura abaixo).
• Chamamos o método execute do objeto SaveDialog1 que se retornar o valor verdadeiro, executará os comandos existentes no escopo do comando If. O diálogo tem o seguinte aspecto:
procedure TForm1.SalvarComo1Click(Sender: TObject); begin SaveDialog1.FileName:= Arquivo; If SaveDialog1.Execute then begin Arquivo:= SaveDialog1.fileName; Memo1.Lines.SaveToFile(arquivo); Titulo; end; end;
Texto colocado na propriedade Title
Só aparecem arquivos com a extensão txt.
Nome atual da variável Arquivo
Texto colocado na propriedade Filter
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 9 -
• Em seguida, a variável Arquivo recebe através da propriedade filename do
objeto SaveDialog1 o nome e caminho do arquivo escolhido pelo usuário, que pode ser diferente do nome que colocamos inicialmente.
• Depois, todo o conteúdo das linhas do Memo1 são gravadas no arquivo cujo nome está guardado na variável Arquivo, através da utilização do método SaveToFile da propriedade Lines deste objeto.
• Finalmente chamamos o procedimento Titulo para atualizar o nome do arquivo, no topo do formulário do Editor.
e) Comando Salvar (opção do menu principal): Caso o arquivo já tenha sido salvo
uma vez, ele terá um nome diferente de “SemNome.txt”, portanto, bastará gravar sem a necessidade de abrir o diálogo de gravação. Mas, quando for a primeira vez, teremos que dar ao usuário a opção de escolher o nome do arquivo e o local onde ele será gravado; portanto, chamaremos a rotina SalvarComo1Click. Veja como ficam os comandos:
• Testamos se a variável Arquivo contém o nome do arquivo “SemNome.txt”
através dos comandos If e ExtractFileName. • Se tiver, chamamos a rotina SalvarComo1Click, passando o parâmetro
Sender, que é obrigatório. • Senão, mandamos salvar as linhas do objeto Memo1 através do método
SaveToFile deste objeto. f) Comando Sair (opção do menu principal): Poderíamos simplesmente colocar aqui o
comando Application.terminate, mas optamos por outra estratégia: vamos perguntar ao usuário se ele realmente quer sair do programa.
• Esta pergunta, se for colocada neste método, nos levará a ter que repeti-la
quando o usuário quiser sair acionando o botão [X] do formulário ou quando acionar [Alt] [F4].
• Para evitar esta repetição, nós iremos acrescentar este questionamento no penúltimo evento programável que acontece ao encerrarmos um aplicativo: o evento OnClose do formulário.
• Neste evento, ainda haverá como “abortarmos” o encerramento do programa, o que não seria possível no último evento: OnDestroy, pois, ao ser executado este evento, não temos mais volta, pois, o formulário já foi fechado.
• Portanto, iremos acrescentar neste evento Sair1Click apenas um comando que fecha o formulário:
procedure TForm1.Salvar1Click(Sender: TObject); begin If ExtractFileName(arquivo) = 'SemNome.txt' then SalvarComo1Click(Sender) else Memo1.Lines.SaveToFile(arquivo); end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 10 -
• O evento OnClose do formulário deverá ficar assim:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin SalvarComo1Click(Sender); If MessageBoxEx(0,'Deseja mesmo sair do programa ?', 'ENCERRAMENTO ...', mb_YesNo + mb_DefButton2 + mb_IconStop, lang_portuguese) = idNo then Abort; end;
ü Utilizaremos para fazer a pergunta ao usuário, a função MessageBoxEx, que
retorna em seu nome qual foi o botão acionado pelo usuário. ü A sintaxe desta função é a seguinte:
MessageBoxEx(Handle, Pergunta, Caption, Botões e ícone, língua do país) ü Onde em ...
Ø Handle: você sempre irá colocar o valor zero. Ø Pergunta: você irá colocar uma constante string (entre apóstrofos) ou
se fizer uso de variáveis, deverá ter o cuidado de transformar para o tipo PChar utilizando esta palavra seguida de um par de parênteses, colocando em seu interior a variável. Exemplo:
MessageBoxEx(0,PChar(‘O arquivo ‘ + nome + ‘ não foi achado.’), .... Ø PChar é um dos transformadores de tipo existente no Delphi. Ele
transforma o tipo string em pchar. O tipo pchar é um “string” de comprimento infinito, que coloca como marca de final o caractere ASCII null (#0). Já o tipo string admite 255 caracteres no máximo.
Ø Caption: você irá colocar o texto que aparecerá no topo da caixa de
mensagem. Como em Pergunta, se também fizer uso de variável, terá que usar o transformador de tipo PChar.
Ø Botões e ícone: você irá colocar uma ou mais constantes somadas,
que representarão algumas situações, tais como a tabela a seguir:
procedure TForm1.Sair1Click(Sender: TObject); begin Form1.Close; end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 11 -
Flag Descrição
MB_ABORTRETRYIGNORE A caixa de mensagem conterá três botões: Abort, Retry, e Ignore. MB_OK A caixa de mensagem conterá um botão OK. MB_OKCANCEL A caixa de mensagem conterá dois botões: OK e Cancel. MB_RETRYCANCEL A caixa de mensagem conterá dois botões: Retry e Cancel. MB_YESNO A caixa de mensagem conterá dois botões: Yes e No. MB_YESNOCANCEL A caixa de mensagem conterá três botões: Yes, No, e Cancel. MB_ICONEXCLAMATION, MB_ICONWARNING
Um ícone com um ponto de exclamação será colocado na caixa de mensagem.
MB_ICONINFORMATION, MB_ICONASTERISK
Um ícone com a letra i dentro de um círculo será colocado na caixa de mensagem.
MB_ICONQUESTION Um ícone com um ponto de interrogação será colocado na caixa de mensagem.
MB_ICONSTOP, MB_ICONERROR, MB_ICONHAND
Um ícone com o sinal STOP será colocado na caixa de mensagem.
MB_DEFBUTTON1 O primeiro botão será o default. MB_DEFBUTTON2 O segundo botão será o default. MB_DEFBUTTON3 O terceiro botão será o default. MB_DEFBUTTON4 O quarto botão será o default.
MB_APPLMODAL A caixa de mensagem é mostrada na forma Modal, isto é, o usuário é obrigado a responder à pergunta antes de passar para o próximo passo do programa.
MB_SYSTEMMODAL
O mesmo que o MB_APPLMODAL, exceto que a caixa de mensagem tem o estilo WS_EX_TOPMOST. Use a caixa de mensagem system-modal para informar o usuário sobre erros sérios que devem ser reparados imediatamente.
MB_TASKMODAL O mesmo que o MB_APPLMODAL, exceto que todas as demais janelas que estiverem abertas serão desabilitadas se o primeiro parâmetro da caixa de mensagem for NULL.
MB_DEFAULT_DESKTOP_ONLY O desktop que recebe a caixa de mensagem deve ser o desktop padrão, se não for, a função falha.
MB_HELP Acrescenta um botão de Help na caixa de mensagens. Acionando este botão ou pressionando F1 gerará um evento de Help.
MB_RIGHT O texto é justificado à direita.
MB_RTLREADING Mostra a mensagem e o caption da direita para a esquerda no sistema Hebreu e Árabe.
MB_SETFOREGROUND A caixa de mensagem torna-se uma janela de fundo (foreground window). Internamente, o Windows chama a função SetForegroundWindow para a caixa de mensagem.
MB_TOPMOST A caixa de mensagem é criada no estilo de janela WS_EX_TOPMOST.
Ø Língua do país: você irá colocar uma das constantes da tabela abaixo, que representa em que língua de qual país os captions dos botões aparecerão:
LANG_AFRIKAANS LANG_ICELANDIC LANG_ALBANIAN LANG_INDONESIAN LANG_ARABIC LANG_ITALIAN LANG_BASQUE LANG_JAPANESE LANG_BELARUSIAN LANG_KOREAN LANG_BULGARIAN LANG_LATVIAN LANG_CATALAN LANG_LITHUANIAN LANG_CHINESE LANG_NEUTRAL LANG_CROATIAN LANG_NORWEGIAN LANG_CZECH LANG_POLISH LANG_DANISH LANG_PORTUGUESE LANG_DUTCH LANG_ROMANIAN LANG_ENGLISH LANG_RUSSIAN LANG_ESTONIAN LANG_SERBIAN LANG_FAEROESE LANG_SLOVAK
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 12 -
LANG_FARSI LANG_SLOVENIAN LANG_FINNISH LANG_SPANISH LANG_FRENCH LANG_SWEDISH LANG_GERMAN LANG_THAI LANG_GREEK LANG_TURKISH LANG_HEBREW LANG_UKRANIAN LANG_HUNGARIAN LANG_VIETNAMESE SUBLANG_ARABIC_SAUDI_ARABIA SUBLANG_GERMAN SUBLANG_ARABIC_IRAQ SUBLANG_GERMAN_SWISS SUBLANG_ARABIC_EGYPT SUBLANG_GERMAN_AUSTRIAN SUBLANG_ARABIC_LIBYA SUBLANG_GERMAN_LUXEMBOURG SUBLANG_ARABIC_ALGERIA SUBLANG_GERMAN_LIECHTENSTEIN SUBLANG_ARABIC_MOROCCO SUBLANG_ITALIAN SUBLANG_ARABIC_TUNISIA SUBLANG_ITALIAN_SWISS SUBLANG_ARABIC_OMAN SUBLANG_KOREAN SUBLANG_ARABIC_YEMEN SUBLANG_KOREAN_JOHAB SUBLANG_ARABIC_SYRIA SUBLANG_NEUTRAL SUBLANG_ARABIC_JORDAN SUBLANG_NORWEGIAN_BOKMAL SUBLANG_ARABIC_LEBANON SUBLANG_NORWEGIAN_NYNORSK SUBLANG_ARABIC_KUWAIT SUBLANG_PORTUGUESE SUBLANG_ARABIC_UAE SUBLANG_PORTUGUESE_BRAZILIAN SUBLANG_ARABIC_BAHRAIN SUBLANG_SERBIAN_LATIN SUBLANG_ARABIC_QATAR SUBLANG_SERBIAN_CYRILLIC SUBLANG_CHINESE_TRADITIONAL SUBLANG_SPANISH SUBLANG_CHINESE_SIMPLIFIED SUBLANG_SPANISH_MEXICAN SUBLANG_CHINESE_HONGKONG SUBLANG_SPANISH_MODERN SUBLANG_CHINESE_SINGAPORE SUBLANG_SPANISH_GUATEMALA SUBLANG_DEFAULT SUBLANG_SPANISH_COSTA_RICA SUBLANG_DUTCH SUBLANG_SPANISH_PANAMA SUBLANG_DUTCH_BELGIAN SUBLANG_ENGLISH_US SUBLANG_ENGLISH_UK SUBLANG_SPANISH_COLOMBIA SUBLANG_ENGLISH_AUS SUBLANG_SPANISH_PERU SUBLANG_ENGLISH_CAN SUBLANG_SPANISH_ARGENTINA SUBLANG_ENGLISH_NZ SUBLANG_SPANISH_ECUADOR SUBLANG_ENGLISH_EIRE SUBLANG_SPANISH_CHILE SUBLANG_ENGLISH_SOUTH_AFRICA SUBLANG_SPANISH_URUGUAY SUBLANG_ENGLISH_JAMAICA SUBLANG_SPANISH_PARAGUAY SUBLANG_ENGLISH_CARIBBEAN SUBLANG_SPANISH_BOLIVIA SUBLANG_ENGLISH_BELIZE SUBLANG_SPANISH_EL_SALVADOR SUBLANG_ENGLISH_TRINIDAD SUBLANG_SPANISH_HONDURAS SUBLANG_FRENCH SUBLANG_SPANISH_NICARAGUA SUBLANG_FRENCH_BELGIAN SUBLANG_SPANISH_PUERTO_RICO SUBLANG_FRENCH_CANADIAN SUBLANG_SWEDISH SUBLANG_FRENCH_SWISS SUBLANG_SWEDISH_FINLAND SUBLANG_FRENCH_LUXEMBOURG SUBLANG_SYS_DEFAULT SUBLANG_SPANISH_DOMINICAN_REPUBLIC SUBLANG_SPANISH_VENEZUELA
ü A função MessageBoxEx retorna em seu nome um identificador que
determinará o botão acionado. A seguir, relacionamos os possíveis identificadores:
IDABORT O botão Abort foi acionado IDCANCEL O botão Cancel foi acionado IDIGNORE O botão Ignore foi acionado IDNO O botão No foi acionado IDOK O botão OK foi acionado IDRETRY O botão Retry foi acionado IDYES O botão Yes foi acionado
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 13 -
ü Veja o aspecto da caixa de mensagem ao darmos o seguinte comando:
If MessageBoxEx(0,’Deseja mesmo sair do programa ?’,’ENCERRAMENTO ...’, mb_YesNo + mb_DefButton2 + mb_IconStop, lang_portuguese) = idNo then ........
ü Voltando à análise da rotina do evento Onclose do formulário, verificamos que, primeiramente o usuário será convidado a salvar o texto através da chamada ao método SalvarComo1Click.
ü Em seguida fazemos a pergunta se ele deseja mesmo sair do programa. Caso o usuário acione o botão [Não], o fechamento do programa será ABORTADO, através do método Abort do evento OnClose do formulário, caso contrário, o fechamento será concluído.
g) Comando Localizar (opção do menu principal): A “busca” é feita de forma
bastante artesanal e nos obrigará a digitação de bastante linhas de código.
• O método em si terá poucos comandos. Digite as linhas em negrito:
ü A variável UltimaLinha deverá ser declarada globalmente como do tipo
integer e neste método está sendo inicializada com o valor zero. Sua função será a de armazenar o número da última linha pesquisada na busca.
ü A variável OffSet também deverá ser declarada globalmente como do tipo integer e está sendo inicializada com o valor 1. Sua função será a de armazenar a última posição da palavra procurada em uma linha.
ü O objeto FindDialog1, como todo objeto de diálogo, deve ser acionado através do método execute. Notamos que desta vez não utilizamos o teste If, uma vez que não é necessário. O diálogo terá o seguinte aspecto:
procedure TForm1.Localizar1Click(Sender: TObject); begin UltimaLinha := 0; OffSet:= 1; FindDialog1.execute; end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 14 -
03
05
06
07
08
04
Ø Ao digitarmos o primeiro caractere do texto a ser localizado, o botão [Localizar próxima] irá ser habilitado, e ao clicar no mesmo, irá provocar a execução do evento FindDialog1Find:
procedure TForm1.FindDialog1Find(Sender: TObject); var texto: string; P, J, Linhas: integer; begin Texto:= FindDialog1.FindText; If length(texto) = 0 then exit; texto:= ansiuppercase(texto); If UltimaLinha <= Memo1.Lines.count-1 then begin P:= PosEx(texto,AnsiUpperCase(Memo1.Lines[UltimaLinha]),OffSet); If P > 0 then begin Linhas:= 0; for j:= 0 to UltimaLinha-1 do linhas:= linhas + length(memo1.lines[j]) + 2; Memo1.SelStart := P - 1 + Linhas; Memo1.SelLength:= length(texto); Offset:= P + length(texto); end else begin Inc(UltimaLinha); OffSet:= 1; FindDialog1Find(Sender); end; end else begin UltimaLinha:= 0; OffSet:= 1; FindDialog1Find(Sender); end; FindDialog1.CloseDialog; end;
ü Uma breve explicação do algoritmo utilizado:
Ø Iremos “varrer” as linhas do Memo1 e testar a presença do texto procurado em cada uma delas, armazenando em uma variável a posição do mesmo. Para isto, utilizaremos o comando PosEx, que para ser reconhecido pelo Delphi exige a declaração da biblioteca StrUtils na cláusula Uses no início da Unit. Veja a sintaxe do comando:
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
PosEx retorna a posição do SubStr em S, iniciando a procura a partir do caractere de
número OffSet. Se Offset é 1 (default), PosEx fica equivalente ao comando Pos, cuja sintaxe é function Pos(const SubStr, S: string): Integer;
PosEx retornará 0 se SubStr não for encontrada, ou se Offset for a maior que o tamanho de S, ou se Offset for menor que 1.
RECURSIVIDADE: uma rotina que chama a si própria !!!
09
10
01
02
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 15 -
Ø Para testarmos a existência do texto procurado mais de uma vez na mesma
linha, teremos que alterar o valor do parâmetro OffSet da função PosEx. Esta providência deverá ser tomada até que nenhuma ocorrência do texto na linha seja mais encontrada. [01] Declaração de variáveis locais:
§ texto: guarda o texto que está sendo procurado § J: auxiliar, utilizadas para numerar linhas. § Linhas: guarda quantidade de caracteres já pesquisados desde o início
do texto. § P: guarda a posição do texto procurado dentro da linha
§ [02] Guarda na variável Texto o texto procurado, digitado no diálogo, e em seguida verifica se o texto existe, isto é, se o usuário realmente digitou um texto para ser procurado e depois, aplica a função AnsiUpperCase, que transforma todos os caracteres em maiúsculos.
§ [03] Se o número da UltimaLinha for menor que a quantidade de linhas do texto, podemos iniciar a procura, mas se não for, volta a procurar do início ( ver [09] ).
§ [04] Determinamos a posição do texto procurado dentro da linha de número UltimaLinha à partir da posição OffSet, que inicialmente é 1.
§ [05] Se o valor de P for maior que zero, significa que foi encontrada pelo menos uma ocorrência do texto procurado dentro da linha atual, portanto, teremos que recontar quantos caracteres existem desde o início do texto. Note que somamos 2 ao total de caracteres de cada linha, isto porque ao final de cada linha sempre são acrescentados pelo próprio editor os caracteres de controle #13 e #10, entrer e linefeed, respectivamente.
§ [06] Neste trecho, informamos onde começa ao texto a ser selecionado (SelStart) e quantos caracteres serão selecionados (SelLength), para que o usuário visualize a posição do texto procurado no texto completo.
§ [07] Agora, atribuímos a OffSet a soma da posição P com o tamanho do texto procurado, para que a próxima procura seja realizada de forma a obtermos uma nova ocorrência do mesmo texto.
§ [08] Caso nenhum ocorrência do texto procurado esteja nesta linha corrente (UltimaLinha) incrementamos o número desta de uma unidade, voltamos o OffSet para o valor 1 e chamamos novamente a mesma rotina, ou seja, esta rotina chama a si própria a este fenômeno damos o nome de RECURSIVIDADE. A recursividade é permitida em Delphi, mas é de inteira responsabilidade do programador o seu controle, pois, se houver um “looping” (laço infinito) vai ocorrer um “estouro de memória” (overflow).
§ [09] Caso o valor da variável UltimaLinha ultrapasse a quantidade total de linhas do texto, iremos permitir a busca à partir do início do texto novamente, atribuindo a esta variável o valor Zero, colocando o valor de OffSet novamente em 1 e utilizando mais uma vez a RECURSIVIDADE chamando esta rotina novamente de dentro dela, agora procurando à partir do início do texto.
§ [10] Finalmente, fechamos a janela de diálogo.
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 16 -
h) Comando Localizar próxima (opção do menu principal): Ao clicarmos nesta opção de menu ou acionarmos a tecla [F3] queremos procurar pela próxima ocorrência do texto procurado. Como as variáveis que controlam o texto a ser procurado são globais: UltimaLinha, OffSet, estes valores estarão apontando para última ocorrência, o que fará com que ao chamarmos novamente o método FindDialog1Find(Sender) estaremos fazendo a busca da próxima ocorrência:
i) Comando Fonte (opção do menu principal): Este comando permitirá trocar a fonte
de todo o texto na tela e na impressora. O método deste evento é bem simples, basta transferir os dados da propriedade font do objeto FontDialog1 para a mesma propriedade do objeto Memo1.
j) Comando Configura (opção do menu principal): Para que se imprima no Delphi, é
necessário acrescentar mais um formulário ao programa. O acréscimo de um novo formulário, vai acarretar à criação de uma nova Unit, que para ser referenciada pela Unit1 deverá ser declarada na mesma. Agora, vamos ver tudo isto em detalhes:
§ Acrescentando um novo formulário: Vá na barra de comandos e acione o ícone
correspondente a New Form:
- Altere a propriedade Name deste novo formulário para QRListForm.
§ Acrescente neste formulário um objeto QuickRep, que representa a folha da
impressora. Este objeto se encontra na aba QReport. Altere as seguintes propriedades deste objeto:
procedure TForm1.LocalizarPrxima1Click(Sender: TObject); begin FindDialog1Find(Sender); end;
procedure TForm1.Fonte1Click(Sender: TObject); begin If FontDialog1.execute then Memo1.font:= FontDialog1.font; end;
New form QuickRep QRMemo Aba QReport
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 17 -
Propriedades Valores Descrição
Bands HasDetail True
Acrescenta uma “band” de detalhe. As “bands” permitem a inclusão de objetos de impressão (veremos detalhes nos projetos seguintes)
Page PaperSize A4 Determina o tamanho do papel que será colocado na impressora
§ Aumente a altura da band Detail até ocupar quase toda a página. § Acrescente um objeto QRMemo que se encontra na aba QReport, dentro da
band Detail. § Altere a propriedade AutoSize do objeto QRMemo1 para false. § Aumente a altura e largura deste objeto para ocupar toda a área da band Detail. § Agora, vá à Unit1 (a do formulário principal) e digite logo após à cláusula
Implementation o comando que aparece em negrito:
§ Este comando é necessário para que possamos referenciar os objetos e dados que
porventura estejam na Unit2 à partir desta Unit1. O local escolhido foi este, pois, é um escopo local, isto é, esta declaração só é percebida pelo programa quando a Unit1 estiver sendo executada. Esta preocupação é necessária, pois, se por acaso tivermos que declarar na Unit2 a presença da Unit1, não ocorreria uma referência circular, que é um erro não permitido no Delphi. A referência circular vem do fato da Unit1 chamar a Unit2 e ao mesmo tempo a Unit2 chamar a Unit1. Como as declarações que fizemos são locais, esta simultaneidade não irá ocorrer.
§ Agora, podemos programar o método do evento Onclick da opção de menu
Configurar:
var Form1: TForm1; Arquivo: string; UltimaLinha: integer; X: integer; implementation uses Unit2; {$R *.dfm}
procedure TForm1.Configurar1Click(Sender: TObject); begin QRListForm.QRMemo1.Lines:= Memo1.lines; QRListForm.QRMemo1.Font:= Memo1.Font; QRListForm.QuickRep1.preview; end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 18 -
§ Observamos nas linhas de programação do método acima, os seguintes detalhes: ü QRListForm é o nome do formulário da Unit2, que contém o objeto
QuickRep1, no qual inserimos o objeto DetailBand1, assim como o objeto QRMemo1.
ü Na primeira linha, atribuímos o conteúdo de todas as linhas do Memo1 que está no formulário Form1 para as linhas do QRMemo1 localizado no formulário QRListForm. O nome do Form1 não foi necessário ser explicitado, pois, este método pertence a este formulário (veja na declaração do método a presença da palavra TForm1).
ü Em seguida, atribuímos as características de fonte do objeto Memo1 às do objeto QRMemo1.
ü Finalmente, iremos executar o método preview do objeto QuickRep1. Este método, fará surgir na tela uma amostra da folha de impressão, contendo na sua parte superior alguns botões já previamente programados.
ü Caso o usuário deseje configurar a impressora, poderá faze-lo clicando no
botão correspondente, daí surgirá o diálogo de configuração de impressora:
Botão de configuração
Botão de Impressão
Sai deste “preview”
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 19 -
k) Comando Imprimir (opção do menu principal): Nesta opção, simplesmente repetimos os comandos da opção Configurar, excetuando o último, onde no lugar do método preview, resolvemos utilizar o método print.
• O método Print do QuickRep envia para a impressora a página ou páginas do
QuickRep1. A quantidade de páginas, vai depender do tamanho do texto. Caso este ultrapasse o limite do papel, o salto de página será automático, retirando do programador esta responsabilidade.
l) Comando Sobre (opção do menu principal): este comando fará surgir um novo formulário contendo os dados do programa, do programador, versão, etc...
• Desta vez, ao invés de criarmos o formulário do nada, vamos aproveitar um dos
formulários já previamente elaborados que está guardado no Repository do Delphi. Neste local, podemos encontrar vários lay-outs preconcebidos, ou até, acrescentarmos lay-outs criados por nós mesmos.
• Para atingir este “repositório” faça o seguinte: ü No Delphi 5: No menu File à New à aba Forms à AboutBox à OK ü Do Delphi 6 em diante: No menu File à New à Other à aba Forms à
AboutBox à OK • Irá surgir um formulário de tamanho reduzido contendo alguns objetos já
colocados. Lembro que nada impede que você crie tudo isto à partir de um formulário vazio:
• Você poderá alterar, por exemplo, a imagem do logotipo do programa. Para
isto, selecione este objeto Image1 e no Object Inspector clique na propriedade Picture. Isto fará surgir o seguinte diálogo:
procedure TForm1.Imprimir1Click(Sender: TObject); begin QRListForm.QRmemo1.Lines:= Memo1.lines; QRListForm.QRmemo1.Font:= Memo1.Font; QRListForm.QuickRep1.print; end;
Panel
Image
Label
Label
Label
Label
Button
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 20 -
• Você poderá alterar os Labels à vontade. Como sugestão, apresentamos a tela a
seguir:
• Note que o fundo da moldura (objeto Panel) passou a ter a cor branca, para que combinasse com a cor de fundo da figura. Para isto, foi alterada a propriedade color deste objeto para clWhite.
• O botão deverá ser programado com o comando que fecha este formulário:
Carrega uma nova figura
Apaga a figura da tela
Retorna ao projeto
Imagem da figura escolhida
procedure TAboutBox.OKButtonClick(Sender: TObject); begin AboutBox.Close; end;
LINGUAGEM DE PROGRAMAÇÃO DELPHI Prof. Alberto Cezar de Carvalho
- Editor de textos simples - Página 21 -
• Para que este formulário seja visto, há necessidade de programarmos o evento Onclick da opção de menu Sobre:
ü Você pode perceber a utilização do método ShowModal do formulário
AboutBox. Este método faz aparecer o formulário na forma modal, isto é, ele tem prioridade sobre qualquer outro formulário: só é permitido passar para outro formulário após o fechamento deste.
ü Para fazer surgir um formulário sem esta prioridade, utilize o método Show.
J J J J J J J J J J J J J
procedure TForm1.Sobre1Click(Sender: TObject); begin AboutBox.ShowModal; end;