21
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á

24 - Editor de textos - alberto.acsoft.com.bralberto.acsoft.com.br/APOSTILAS/24 - Editor de textos.pdf · A linha digitada, faz a concatenação (justaposição) de dois strings (textos)

  • Upload
    vonhi

  • View
    215

  • Download
    0

Embed Size (px)

Citation preview

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;