Escolar Documentos
Profissional Documentos
Cultura Documentos
Publicidade
HP:http://lloydsoft.no-
ip.com
E-
Mail:lloydsoft@yahoo.com.br
Última Atualização:
14/02/2005
Lloyd Dickinson
Atualizações
Dicas Dicas
Versão
Adicionadas Modificadas
1.0 - 50 dicas 50 0
1.1 - 78 dicas 28 0
1.2 - 115 dicas 37 0
1.3 - 145 dicas 30 0
1.4 - 179 dicas 34 0
1.5 - 208 dicas 19 0
1.6 - 229 dicas 21 0
1.7 - 300 dicas 71 0
1.8 - 350 dicas 50 0
1.9 - 400 dicas 50 1
2.0 - 500 dicas 100 1
2.1 - 550 dicas 50 6
2.2 - 600 dicas 50 2
2.3 - 650 dicas 50 4
2.4 - 700 dicas 50 4
2.5 - 750 dicas 50 12
2.6 - 800 dicas 50 26
2.7 - 850 dicas 50 10
Obs.: Muitos usuários me perguntam o porque
da demora para atualizar a DTDelphi! É Simples!
Só atualizo quando há novas dicas suficientes
para dar um acréscimo significativo a lista, ou
seja, quando consigo encontrar 50 novas dicas,
atualizo! Por isso que é muito importante a
contribuição de todos que a utilizam!
Vamos lá!! Estamos quase chegando a 1000!!
SEQUÊNCIA 2
1 = Branco-Laranja
2 = Laranja
3 = Branco-Verde
4 = Azul
5 = Branco-Azul
6 = Verde
7 = Branco-Marrom
8 = Marrom
0 0 NUL 32 20 64 40 @ 96 60 `
1 1 SOH 33 21 ! 65 41 A 97 61 a
2 2 STX 34 22 “ 66 42 B 98 62 b
3 3 ETX 35 23 # 67 43 C 99 63 c
4 4 EOT 36 24 $ 68 44 D 100 64 d
5 5 ENQ 37 25 % 69 45 E 101 65 e
7 7 BEL 39 27 ‘ 71 47 G 103 67 g
8 8 BS 40 28 ( 72 48 H 104 68 h
9 9 TAB 41 29 ) 73 49 I 105 69 i
10 A LF 42 2A * 74 4A J 106 6A j
11 B VT 43 2B + 75 4B K 107 6B k
12 C FF 44 2C , 76 4C L 108 6C l
13 D CR 45 2D - 77 4D M 109 6D m
14 E SO 46 2E . 78 4E N 110 6E n
15 F SI 47 2F / 79 4F O 111 6F o
16 10 DLE 48 30 0 80 50 P 112 70 p
17 11 DC1 49 31 1 81 51 Q 113 71 q
18 12 DC2 50 32 2 82 52 R 114 72 r
19 13 DC3 51 33 3 83 53 S 115 73 s
20 14 DC4 52 34 4 84 54 T 116 74 t
21 15 NAK 53 35 5 85 55 U 117 75 u
22 16 SYN 54 36 6 86 56 V 118 76 v
23 17 ETB 55 37 7 87 57 W 119 77 w
24 18 CAN 56 38 8 88 58 X 120 78 x
25 19 EM 57 39 9 89 59 Y 121 79 y
26 1A SUB 58 3A : 90 5A Z 122 7A z
27 1B ESC 59 3B ; 91 5B [ 123 7B {
28 1C FS 60 3C < 92 5C \ 124 7C |
29 1D GS 61 3D = 93 5D ] 125 7D }
30 1E RS 62 3E > 94 5E ^ 126 7E ~
31 1F US 63 3F ? 95 5F _ 127 7F DEL
Caracteres Especiais
Código ASCII na Fonte Courier New
Ascii 0 {Nulo, Sem Som}
Ascii 1
Ascii 2
Ascii 3
Ascii 4
Ascii 5
Ascii 6
Ascii 7
Ascii 8 {BackSpace}
Ascii 9 {Tab}
Ascii 10
Ascii 11
Ascii 12
Ascii 13 {Enter}
Ascii 14
Ascii 15
Ascii 16 {Shift}
Ascii 17 {CTRL}
Ascii 18 {ALT}
Ascii 19
Ascii 20 {CapsLock}
Ascii 21
Ascii 22
Ascii 23
Ascii 24
Ascii 25
Ascii 26
Ascii 27
Ascii 28
Ascii 29
- Ascii 30
- Ascii 31
Ascii 32 {Espaço}
! Ascii 33
” Ascii 34
# Ascii 35
$ Ascii 36
% Ascii 37
& Ascii 38
‘ Ascii 39
( Ascii 40
) Ascii 41
* Ascii 42
+ Ascii 43
, Ascii 44
- Ascii 45
. Ascii 46
/ Ascii 47
0 Ascii 48
1 Ascii 49
2 Ascii 50
3 Ascii 51
4 Ascii 52
5 Ascii 53
6 Ascii 54
7 Ascii 55
8 Ascii 56
9 Ascii 57
: Ascii 58
; Ascii 59
< Ascii 60
= Ascii 61
> Ascii 62
? Ascii 63
@ Ascii 64
A Ascii 65
B Ascii 66
C Ascii 67
D Ascii 68
E Ascii 69
F Ascii 70
G Ascii 71
H Ascii 72
I Ascii 73
J Ascii 74
K Ascii 75
L Ascii 76
M Ascii 77
N Ascii 78
O Ascii 79
P Ascii 80
Q Ascii 81
R Ascii 82
S Ascii 83
T Ascii 84
U Ascii 85
V Ascii 86
W Ascii 87
X Ascii 88
Y Ascii 89
Z Ascii 90
[ Ascii 91
\ Ascii 92
] Ascii 93
^ Ascii 94
_ Ascii 95
` Ascii 96
a Ascii 97
b Ascii 98
c Ascii 99
d Ascii 100
e Ascii 101
f Ascii 102
g Ascii 103
h Ascii 104
i Ascii 105
j Ascii 106
k Ascii 107
l Ascii 108
m Ascii 109
n Ascii 110
o Ascii 111
p Ascii 112
q Ascii 113
r Ascii 114
s Ascii 115
t Ascii 116
u Ascii 117
v Ascii 118
w Ascii 119
x Ascii 120
y Ascii 121
z Ascii 122
{ Ascii 123
| Ascii 124
} Ascii 125
~ Ascii 126
Ascii 127
¬ Ascii 128
Ascii 129
Ascii 130
’ Ascii 131
Ascii 132
&ldots; Ascii 133
Ascii 134
! Ascii 135
Æ Ascii 136
0 Ascii 137
` Ascii 138
9 Ascii 139
R Ascii 140
Ascii 141
Ž Ascii 142
Ascii 143
Ascii 144
‘ Ascii 145
‘ Ascii 146
” Ascii 147
” Ascii 148
o Ascii 149
- Ascii 150
- Ascii 151
Ü Ascii 152
” Ascii 153
a Ascii 154
: Ascii 155
S Ascii 156
Ascii 157
~ Ascii 158
x Ascii 159
Ascii 160
¡ Ascii 161
¢ Ascii 162
£ Ascii 163
¤ Ascii 164
¥ Ascii 165
¦ Ascii 166
§ Ascii 167
¨ Ascii 168
© Ascii 169
ª Ascii 170
« Ascii 171
Ascii 172
Ascii 173
® Ascii 174
¯ Ascii 175
° Ascii 176
± Ascii 177
² Ascii 178
³ Ascii 179
´ Ascii 180
µ Ascii 181
Ascii 182
· Ascii 183
¸ Ascii 184
¹ Ascii 185
º Ascii 186
» Ascii 187
¼ Ascii 188
½ Ascii 189
¾ Ascii 190
¿ Ascii 191
À Ascii 192
Á Ascii 193
 Ascii 194
à Ascii 195
Ä Ascii 196
Å Ascii 197
Æ Ascii 198
Ç Ascii 199
È Ascii 200
É Ascii 201
Ê Ascii 202
Ë Ascii 203
Ì Ascii 204
Í Ascii 205
Î Ascii 206
Ï Ascii 207
Ð Ascii 208
Ñ Ascii 209
Ò Ascii 210
Ó Ascii 211
Ô Ascii 212
Õ Ascii 213
Ö Ascii 214
× Ascii 215
Ø Ascii 216
Ù Ascii 217
Ú Ascii 218
Û Ascii 219
Ü Ascii 220
Ý Ascii 221
Þ Ascii 222
ß Ascii 223
à Ascii 224
á Ascii 225
â Ascii 226
ã Ascii 227
ä Ascii 228
å Ascii 229
æ Ascii 230
ç Ascii 231
è Ascii 232
é Ascii 233
ê Ascii 234
ë Ascii 235
ì Ascii 236
í Ascii 237
î Ascii 238
ï Ascii 239
ð Ascii 240
ñ Ascii 241
ò Ascii 242
ó Ascii 243
ô Ascii 244
õ Ascii 245
ö Ascii 246
÷ Ascii 247
ø Ascii 248
ù Ascii 249
ú Ascii 250
û Ascii 251
ü Ascii 252
ý Ascii 253
þ Ascii 254
ÿ Ascii 255
Lista Geral
1. Como Fazer um Protetor de Tela no Delphi
2. Linkar um OBJ ao executavel
3. Alterar o LOCAL SHARE via programação
4. Verificando se o Delphi esta Aberto
5. Criando Formulários
6. Criado Alias via programação
7. Desabilitar Teclas Alt+Ctrl+Del
8. Splash Screen
9. Para Saber Somente o Path da Aplicação
10. Como Saber se o aplicativo ja foi aberto
11. Impressão Com o TPrinter
12. Imprimir Direto Para Impressora
13. Definir o tamanho do papel em Tprinter
14. Como Criar Forms Em Tempo de Execução
15. Adaptando para resoluções de video
diferentes
16. Executar um programa do DOS
17. Como posso rolar um form com PgUp e PgDn
18. Tocando Sons WAV
19. Colocando funções em uma DLL
20. Compactando Tabelas
21. Verifica Validade de CGC e CPF
22. Gera número por extenso
23. Preenche com quantidade determinada de
zeros o lado esquerdo de uma string
24. Ponto Decimal
25. FindNearest numa Query
26. Relatórios em HTML
27. Desligando Windows via programação
28. Como saber se o CD está no drive
29. Tradução de Mensagens
30. Função que devolve tempo decorrido em uma
string
31. Criando uma rotina para pegar todos os erros
do programa
32. Capturando conteúdo do desktop
33. Obtendo número do registro atual
34. Enviando um arquivo para a lixeira
35. Carregar um cursor animado
36. Modificando a posição do cursor em um
Memo
37. Traduzindo a mensagem Delete Record ?
38. Pegando o Nome do usuário e a Empresa do
Windows
39. Escrevendo um Texto na Diagonal usando o
Canvas
40. Fundo do texto transparente
41. Formatação de Casas Decimais
42. Escondendo/Mostrando o botão Iniciar
43. Esconde/Mostra a Barra de Tarefas
44. Detectando o Numero Serial do HD
45. Como Limpar Todos os Edit’s de um Form de
uma só vez?
46. Marcando um pedaço do código
47. Alterar o papel de parede 1
48. Alterando cor de linha de um DBGrid
49. Diretório de instalação do windows
50. Exclusividade para o programa
51. Substituindo TAB pelo ENTER
52. Copiando arquivos
53. Criando tabela em tempo de execução
54. Armazenando BMP’s em arquivos RES
55. QR armazenado num Blop
56. Deletando um arquivo
57. Diretório Windows e System
58. Alterar o papel de parede 2
59. AutoExecução do Programa via Registro
60. Como fazer um Hot Link
61. Como saber se o disquete está no drive
62. Formatar disquete
63. Como detectar as teclas de seta
64. Caps Lock e Num Lock
65. BDE em 1 disquete
66. Cor de fundo do hint
67. Margem para RichText
68. Mostrando progresso de uma SQL
69. Código usados pelas impressoras HP
70. Verificando atributo do arquivo
71. Um Contador de letras
72. Obtendo o diretório de uma Alias
73. Como Finalizar o Windows sem Avisar?
74. Como impedir de apagar um registro em um
DBGRID através de CTRL+DEL?
75. Backup e Restauração
76. Executar um programa DOS
77. Trabalhando com horas
78. Para colocarmos um .bmp como figura de
fundo
79. Escondendo o Programa de Ctrl+Alt+Del
80. Formulário Transparente
81. Mover Formulário em todas as partes
82. Filtrando registros com o Quickreport
83. Como executar programas externos
84. Alterando Idapi32.Cfg Via Programa
85. Trocando a cor da fonte num DBGrid
86. Pegando a linha e coluna atuais de um memo
87. Pegar nome do usuário na rede
88. Criando tabelas
89. Gerenciando mais de uma linha selecionada
num DBGrid
90. Traduzindo o preview padrão do Quickreport
91. Extraindo o ano, mês ou dia de uma data via
SQL
92. Data por extenso no Quickreport
93. Imprimindo um campo memo via Canvas
94. Procura e substituição de string num campo
memo
95. Testando drives
96. Como saber o estado das teclas Num lock,
Caps lock e Scroll lock
97. Como compartilhar uma pasta de um outro
micro e mapear com uma letra
98. Como extrair o ícone de um executável
99. Aguardar um determinado número de
segundos
100. Como extrair o número de cores do modo de
vídeo corrente do Windows95
101. Verificando a memória
102. Trocando a cor de uma célula num DBGrid
103. Exponenciação
104. Como manipular arquivos INI
105. Como extrair o tamanho de um arquivo
106. Como alterar a data e a hora do sistema
107. Como obrigar a digitação de caracteres
maiúsculos num campo memo
108. Como validar a entrada em um TEdit
109. Como conectar uma unidade de rede
110. Inserindo um Combobox num DBGrid
111. Definido o tamanho mínimo e máximo de um
formulário
112. Chaves do Registro
113. Posicionando o cursor numa linha de um
Memo ou RichEdit
114. Como verificar se um arquivo existe?
115. Evitando Perdas de Dados
116. StrToIntDef
117. Quebra de String
118. Inserindo zeros no inicio de um inteiro
119. Para dar a senha de uma tabela Paradox no
programa
120. Pegando o registro do windows
121. Fechar outro programa
122. Como Manipular arquivos .INI 2
123. Pegando a data de um arquivo
124. Compactar tabelas
125. Criando diretório
126. Reindexando índices
127. Verificando se a impressora está ativa
128. Interceptando as teclas de função no seu
programa
129. Copiando arquivos via programação
130. Função que retorna o nome do Computador
131. Escondendo janelas filhas minimizadas
132. Executando uma única cópia do aplicativo
133. Alterar as cores do título de um DBGrid em
tempo execução
134. Como fazer para o computador soar o beep
135. Como mostrar o mouse como uma ampulheta
136. Como controlar o pressionamento da tecla
Enter
137. Como varrer uma tabela inteira
138. Como Copiar os valores de campos de uma
tabela para outra
139. Como verificar se um campo inteiro é par ou
ímpar
140. Como verificar se uma string contém um
inteiro
141. Como subtrair datas
142. Principais Procedimentos e Funções Pré
definidas
143. Definindo Atributo de um arquivo
144. Executável com parâmetros
145. Funções Aritméticas suportadas pelo Pascal
146. Formatando Strings
147. Como controlar o fechamento de um
formulário
148. Método de procura em tabela indexada
149. Como evitar repetição em uma lista de
ComboBox
150. Caracteres Especiais que compõem uma
MaskEdit
151. Exemplo de Arraste
152. Convertendo a primeira letra de um EditBox
para maiúsculas
153. Criando janelas não retangulares
154. Detectando a finalização do Windows
155. Alinhando itens do menu principal à direita
156. Usando funções externas (de DLLs)
157. Manipulando Application
158. Executando ações padrão de um Ole
Container
159. Verificando se há uma cópia em execução
160. Alterando o glyph dos botões do DbNavigator
161. Paradox em Rede
162. Hint Com Quebra De Linha
163. AutoOcultar a barra de tarefas
164. Como mover um componente em Run-time
165. Executar um AVI no Form
166. Colocar zeros a esquerda no componente Edit
167. Mostrar o HINT num Panel
168. Configuração do BDE para ambiente de rede
169. Verificando o seu endereço IP
170. Verificando se já estou conectado na Internet
171. Desabilitar o botão fechar o form
172. Chamar um site utilizando o seu browse
padrão
173. Localizar Arquivos do Windows
174. Criar um documento no Word
175. Ativar a proteção de tela
176. Desligar e Ligar monitor
177. Abrir e fechar o drive de CD-ROM
178. Copiar registros de tabela para o Clipboard
179. Personalizar a mensagem de erro do Delphi
180. Colocar uma ProgressBar da StatusBar
181. Verificar se uma string contém uma hora
válida
182. Verificar se uma string contém um valor
numérico válido
183. Mudar a resolução do vídeo via programação
184. Simular um CharCase no DBGrid
185. Verificar se uma string é uma data válida
186. Limpar um campo tipo data via programação
187. Obter o endereço IP do Dial-Up
188. Exibir a caixa de solicitação de senha do
banco de dados
189. Truncar valores reais para apenas n casas
decimais
190. Excluir todos os registros de uma tabela
191. Saber se o sistema está usando 4 dígitos
para o ano
192. Imprimir caracteres acentuados diretamente
para a impressora
193. Imprimir texto justificado na impressora
Epson LX-300
194. Descobrir o código ASCII de uma tecla
195. Usar eventos de som do Windows
196. Trabalhar com Filter de forma mais prática
197. Reproduzir um arquivo WAV
198. Copiar arquivos usando curingas (*.*)
199. Excluir arquivos usando curingas (*.*)
200. Definir a quantidade de registros a ser
impressa
201. OnGetEditMask, OnGetEditText e
OnSetEditText do TStringGrid
202. Fazer a barra de título ficar intermitente
203. Posicionar o cursor do mouse em um controle
204. Mostrar o Hint para cada coluna do StringGrid
205. Alterar o papel de parede 3
206. Arquivos AVI e WAV em tabelas
207. Copiar registros de uma tabela incluindo
valores NULL
208. Jogar uma imagem direto para um campo da
tabela
209. Retornar a coluna ativa do DBGrid
210. Imprimir em impressora matricial em modo
caracter
211. Gravar imagem JPG em tabela Paradox
212. Ler imagem JPG da tabela Paradox
213. Como saber quantos dias tem no mes
214. Como saber se o ano é bisexto
215. Colocar o mes por extenso
216. Chamar um e-mail pelo Delphi
217. Imprimir em impressora matricial em modo
caracter via Rede
218. Link para WEB
219. Configurar o Delphi para acessar tabelas do
Acess
220. Emular o pressionamento de uma tecla
221. Procurar arquivos
222. Ligar/desligar a tecla Caps Lock
223. Verificar se uma determinada tecla está
pressionada
224. Fazer pesquisa incremental
225. Implementar rotinas assembly em Pascal
226. Alterar o nome de volume (Label) de um
disco
227. Evitar a proteção de tela durante seu
programa
228. Validar datas
229. Formatar CEP
230. Quantas Segundas tem num mês
231. Retorna a quantidade de dias uteis entre
duas datas
232. Como registrar um OCX
233. Como usar recursos do word
234. Bloqueio de palavras
235. Esconder o icone da Barra de Tarefas
236. Texto Rotativo
237. Enviando caracteres para outra aplicação
238. Limitando a região de movimentação do
mouse
239. Executar Internet Explorer
240. Enviar um email
241. Listbox
242. Capturar ecrã
243. String Grid Colorido
244. Utilizar o MessageBox com parâmetros
245. Cor em DbGrid
246. Todos os programas que estão em execução
247. Evitando o erro de Key Violation
248. Conferindo se o processador da máquina é
386, 486 ou Pentium
249. Apagar um subdiretório
250. Abrir arquivos com aplicativo associado
251. Inserindo uma Imagem no Formulário
252. Número de cores suportadas pelo seu Monitor
253. Verificando se uma determinada fonte esta
instalada
254. Listando os campos da tabela num Memo
255. Imprimindo o conteúdo de um Memo
256. Verificando o tipo de Drive
257. Como tocar sons no auto-falante interno do
PC
258. Apagando todos os registros da tabela
259. Como desenhar um Bitmap num form
260. Evitando caracteres com acento
261. Executando uma chamada para a Conexão
Dial-Up
262. Capturar informações do ambiente DOS
263. Capturar a data da BIOS do computador
264. Manda o Form para frente
265. Form com um furo da pra ve atraz
266. Abrir as configurações do Vídeo do Painel de
Controle
267. Simular o pressionamento de uma
combinação de teclas
268. Alterar o ícone do botão iniciar do Windows
269. Inverter os botões do mouse
270. Clicar com o mouse
271. Executar algo antes de minimizar
272. Esconder icones do desktop
273. Senha em tabelas
274. Rodar videos em um panel
275. Sql por campo edit pesquisando pelo nome
276. Sql relacionada com a primeira letra
277. Fazer um campo memo ocupar 2 páginas
278. Procura com mais de um Banco de Dados
279. Senhas Aleatórias
280. Configurações internacionais
281. Desenhando com tipos diferentes de linhas
282. Desabilitando o Splash Screen do Report
Smith
283. Verificar se o registro está travado
284. Cursor customizado
285. Dica impressora matricial
286. Retorna a cor de um componente no formato
string
287. Retornar o nome do usuário que esta com a
tabela Exclusiva
288. Mostrar as fontes TrueType Instaladas
289. Como criar um contador de página no QR
290. Como retornar a uma lista os campos
indexados de um tabela
291. Como definir seu próprio hotkey
292. Transformando ícone em um bitmap
293. Transferindo o conteúdo de um memo para
um memofield
294. Mudar o foco do campo em um Dbgrid
295. Como tirar os espaços no início e no final de
uma string
296. Como colocar uma coluna do DBGrid em
maiuscula
297. Simular Print Screen
298. Resolvendo Problemas do Print-Setup do
QuickReport
299. Caption do BitBtn com várias linhas
300. Alterar fonte do hint
301. Ocultar/Mostrar o Relógio na Barra de Tarefas
302. Caixa Mista
303. Justificar Texto
304. Código gerador de senha
305. Espaço maior no RichEdit
306. Como criar novas tabela a partir de consulta
sql
307. Código sequencial automático
308. Encriptar/Desencriptar strings
309. Encriptar/Desencriptar arquivos
310. Colocar os bitmaps na dll
311. Teclas mágicas para trabalhar mais rápido
312. Procurar Strings numa ListBox
313. DbGrid Zebrado
314. Enviar relatório do Quickreport para TXT
315. Como retornar a cor de um pixel de uma
imagem
316. Criando uma barra de status
317. Abreviando Nomes
318. Acessando Membros Protegidos de um Objeto
319. Alterando a fonte de determinado registro em
um DBGrid
320. Apagar arquivos via MS-DOS
321. Armazenado num Blop
322. Array de Edit boxes
323. Arredondando valores
324. Centralizando uma string
325. Chamando Help
326. Colocando bitmaps num ComboBox
327. Colocando uma barra de progresso para o
batchmove
328. Colocar Senha em tabelas Paradox
329. Como evitar a mensagem de erro Key
Violation
330. Como Trocar o Cursor do Mouse
331. Configurando a Rede em Win95/Win98 com
Delphi
332. Configurando RedeNovell NetWare com Delphi
333. Convertendo nomes longos para nomes
curtos
334. Adicionando a soma de Fields no
QRExpression do QuickReport
335. Criando e apagando TFields em Run-Time
336. Alterando parcialmente o conteúdo da
prop.SQL de uma Query
337. Como fazer uma unit como biblioteca
338. Como imprimir com codigo fonte
339. Dicas de DbGrid
340. Para colocar um back ground nos forms
341. Como indexar um vetor
342. Como formatar data para exibição por
extenso
343. Como converter DBF para Paradox e Acess
paar Paradox
344. Como acrescentar caracteristicas em um
objeto
345. Como acessar pelo Delphi, tabelas no Acess
346. Extrair palavra que está sob o cursor
347. Como extrair o primeiro nome de uma pessoa
348. Criar atalho no desktop
349. Imprimir com precisão milimétrica
350. Como alterar o caption da janela de preview
do quickreport
351. Como Instalar RXLIB no Delphi 5
352. Verificação de PIS
353. Imprimindo com o Bloco de Notas
354. Estado de uma tabela
355. Adicionando uma nova fonte no Windows
356. Alternando Bitmaps no Fundo de um Form
357. Atualizando as informações em ambiente de
rede
358. BookMarks
359. Centralizando um formulário
360. Colocando BMP’s em StringGrids
361. Consultando entre datas utilizando SQL
362. Convertendo PCHAR para STRING
363. Convertendo valor Hexadecimal para Inteiro
364. Convertendo valores de Campos
365. Copiando arquivos de diretório para diretório
366. Copiando arquivos usando o Shell do
Windows
367. Criando Alias de Banco de Dados no código
368. Criando componentes em tempo de execução
369. Criando cores personalizadas
370. Criando uma barra de status completa
371. Deletando um Diretório
372. Descobrindo se há impressora instalada
373. Descobrindo se o aplicativo está minimizado
374. Descobrindo se um form já está criado
375. Descobrindo se um form já está criado 2
376. Descobrindo se um objeto tem uma
determinada propriedade
377. Descobrindo se uma janela está maximizada
378. Detectando e Finalizando o screen saver
379. Exibindo solicitação de senha do banco dados
personalizada
380. Exibindo corretamente o conteúdo dos
campos boolean
381. Exibindo o diálogo About do Windows
382. Exibindo ou compararando data de arquivos
383. Exportando Relatório do QuickReport para
HTML, DOC, TXT ou XLS
384. Fazendo cálculo de horas
385. Fazendo sua aplicação executar sem
apresentar o form principal
386. Fazendo um Pack em arquivos PARADOX
387. Fazendo uma impressão direta
388. Fazendo uma janela filha de outra sem usar
MDI
389. Finalizando todas as tarefas
390. Como incrementar 1 mês numa data
391. Como obter informações do S.O.
392. Unit com varias funções de datas
393. Consulta SQL que usa a data do sistema
394. Imprimindo Forms
395. O Enigma da propriedade filter do Ttable
396. Permitir cancelar processo demorado
397. Descobrir se uma data é fim do mês
398. Obter o tipo de dado de um valor no Registro
do Windows
399. Programar meu aplicativo para abrir arquivos
a partir do Windows Explorer
400. Consultar por mês de um campo data
401. Criando tabelas via SQL
402. Obter nomes dos campos de uma tabela
403. Nomeando um relatório no spool de
impressão do Windows
404. Impedir que o form seja arrastado para fora
das margens da tela
405. Mostrar mensagem mesmo que esteja no
Prompt do DOS
406. Criar sub-diretório no diretório do EXE
407. Enviar comandos de rolagem vertical para um
TMemo
408. Criar form sem título que possa ser arrastado
409. Definir data/hora de um arquivo
410. Ocultar/exibir o cursor do mouse
411. Executar um programa e aguardar sua
finalização antes de continuar
412. Adicionar o evento OnClick do DBGrid
413. Criar caixas de diálogo em tempo de
execução
414. Fechar um aplicativo com uma mensagem de
erro fatal
415. Criar um EXE que seja executado apenas
através de outro EXE criado por mim
416. Resolver “Internal error near: IBCheck” do
Interbase 5.1.1 Server no NT
417. Obtendo uma data acrescida de xMeses
418. Separar (filtrar) caracteres de uma string
419. Trabalhar com cores no formato string
420. Verificar se determinado programa está em
execução (Word, Delphi, etc)
421. Gerar uma tabela no Word através do Delphi
422. Obter a quantidade de registros total e visível
de uma tabela
423. Salvar/restaurar o tamanho e posição de
Form’s
424. Criando um campo lookup em tempo de
execução
425. Mostrar um Form de LogOn antes do Form
principal
426. Saber se a impressora atual possui
determinada fonte
427. Saber se determinada Font está instalada no
Windows
428. Como importar dados de um arquivo texto
para uma Tabela
429. Como Imprimir um arquivo direto para a
Impressora
430. Como Usar ASSEMBLER com Delphi
431. Como Retornar Várias informações Sobre a
BIOS
432. Quando der problema na instalação do
componente
433. Digito Verificador
434. O Delphi faz alguma coisa em C++.
435. Como enviar dados do Delphi para o Excel
436. Virtual keys
437. Validando número de cartão de crédito
438. Utilizando o registro do Windows
439. Usando TList e Record como Array
440. Usando o objeto Sender internamente
441. Tratando erros no banco de dados
442. Tirando os botões Load e Save do Preview do
QuickReport
443. Substituindo os botões do DBNavigator
444. Significados dos componentes da RXLIB
445. Selecionando um formulário coberto por um
componente
446. Selecionando registros órfãos via SQL
447. Salvando e Restaurando uma Tstringgrid
448. Retirando acentos de uma string
449. Removendo a barra de rolagem vertical do
DBGrid
450. Como reduzir o tempo e carga de um
programa
451. Obtendo o próximo dia útil
452. Obtendo o último dia útil
453. Obtendo o nº de ocorrências de uma string
‘T’ dentro de outra ‘S’
454. Obtendo o nome das tabelas de um
determinado alias
455. Obtendo o indice de um componente em
tempo de execução
456. Obtendo o extenso do mês passado por
parâmetro
457. Obtendo o extenso de uma data informada
458. Obtendo data do primeiro dia util do mês
459. Obtendo a versão e outras informações do
BDE
460. Obtendo a versão da tabela
461. Obtendo a próxima palavra após os espaços
determinados por ‘BlankToSkip’
462. Obtendo a Posição Inicial da Próxima palavra
após o caracter indicado por ‘InitPos’
463. Obtendo a posição da enésima ocorrência da
string ‘T’ na string ‘S’
464. Obtendo a maior data anterior a uma data
inválida
465. Obtendo a lista de Aliases disponíveis
466. Obtendo a data do último dia do mês, ou
último dia útil, de uma data informada
467. Mudando o foco para o próximo controle
468. Mudando a fonte de um menu
469. Movimentando o ponteiro do mouse sem a
intervenção do usuário
470. Mostrando um formulário Modal usando Show
471. Mostrando a lista de último acesso dos
arquivos aberto ultimamente
472. Montando um Banco de Dados
Cliente/Servidor
473. Lendo e gravando arquivos de texto
474. Lendo e Escrevendo dados binários no
Registro do Windows
475. Invertendo uma string
476. Instalando componentes
477. Imprimir no Delphi como no DOS “a mesma
fonte”
478. Imprimindo um bitmap utilizando TPrinter
479. Fazendo um Web Browser
480. Exibindo caixa de diálogo personalizada de
solicitação de senha do banco dados
481. Evitando que o Form seja redimensionado
482. Enviando combinação de teclas para o buffer
do teclado
483. Como criar uma figura do tipo marca d’ água
484. Bloqueando um arquivo em ambiente de rede
485. Recuperar a Velocidade da CPU
486. Utilizando o Dblookupcombobox
487. Adicionar horas
488. Checa se o Simbolo da UF é Valido
489. Testa se seu processador pentium tem o Bug
fatal
490. Como verificar se falta algum edit para
preencher
491. Como gerar um clone de um programa
492. Como criar um arquivo de Backup muito feio
mais eficiente
493. Como ler código de barras
494. Como desenhar figuras no desktop
495. Para você mudar as imagens do DbNavigator
496. Quantas Palavras existem?
497. Exporta uma imagem para o formato WMF
498. Converte hora (formato HH:MM) para
minutos
499. Como Visualizar arquivos ARJ
500. Visualizar aruqivos compactados CAB
501. Replace Str
502. Abrir tableas paradox protegidas por senha
503. Drag e Drop com o Windows Explorer
504. Mudandp o texto de um edit no evento
OnChange
505. Desabilitando um RadioButton Num
RadioGroup
506. Obter o tipo de um drive
507. Executar um arquivo com extenção *.lnk
508. Gravando e reproduzindo as teclas digitadas
no delphi
509. Tipo de Conexão
510. Sender - Objeto
511. Deletar com QUERY
512. Criar labels em tempo de execução
513. Insert em duas tabelas
514. Vetor Dinamico
515. Tipos de Array
516. Biblioteca para operações com DiskDrives
517. Biblioteca para Operações com Mouse
518. Biblioteca para Operações com Strings
519. Biblioteca para Operações com o Sistema
520. Atribuindo a uma coluna do StringGrid como
só de leitura
521. Chamar um programa e esperar a finalização
522. Colocar o cursor no final do TEdit ao receber
o foco
523. Convertendo um número real para string com
2 casas
524. Como acrescentar dias uteis a uma data
525. Como converter de decimal para binario
526. Como converter decimal para base
especificada
527. Como converter decimal para romanos
528. Como desconectar unidade de rede
529. Diferença entre duas horas
530. Tamanho de um Diretorio
531. Eliminar Caracteres de Strings
532. Verificar se variavel está vazia
533. Executar o Windows Explorer com parametros
534. Como Esvaziar uma Tabela
535. Pegar informações de Executavel
536. Verifica tipo de arquivo
537. Converter qualquer variavel em string
538. Calcular percentual de Valor
539. Retorna Path de Browser Padrão
540. Resgate de variaveis do ambiente DOS
541. Tipo de Executável
542. Path de Aplicativo associado a uma extensão
543. Nome do Host da Conexão
544. Clone Monocromático de BitMap
545. Quantos fins de semana já se passaram no
corrente ano
546. Testa se a hora é antes de Meio dia
547. Habilita o Autorun para CD-Rom
548. Reindexando Indices
549. Como achar um Modem e sua porta
550. Nome da Impressora Padrão
551. Verificar se Impressora esta Conectada
552. Exibindo as propriedades do arquivo
553. Dicas Práticas
554. Criar Dll´s
555. Criando um componente Skin
556. Armazanando sons, vídeos em bancos de
dados
557. Usuario logado
558. Paradox X Interbase
559. Executando sons no PC-Speaker
560. Troca de tamanho do papel
561. Testa se determinada tecla está pressionada
562. Como evitar efeito de maximização
563. Como usar as teclas de função F1, F2, etc?
564. Rotina genérica para tratamento de erros na
aplicação - BDE
565. Como usar o Install Shield
566. Como limpar o conteudo de um
LookupComboBox?
567. Como fazer para o sistema nao pedir o Login
(Password) Banco de Dados
568. Dicas QuickReport
569. Biblioteca com funções para Strings
570. Função de potenciação - Juros
571. Lista de erros BDE
572. Como utilizar strings de recurso em suas
aplicações
573. Desvendando a programação “Client/Server”
574. Como inserir um registro com o componente
UpDateSQL
575. Como saber qual o objeto que esta com o
foco no form
576. Como utilizar o form Sobre padrão do
Windows
577. Como evitar as mensagens de Warning do
Compilador (Variavel não inicializada)
578. Como diminuir o tempo de abertura do Table
e Query
579. Caixas de mensagens da aplicação
580. Retorna que tipo de variavel é
581. Retorna o último acesso de um arquivo
582. Retorna a versão do aplicativo
583. Converte um arquivo JPEG em BMP
584. Retorna a idade atual de uma pessoa
585. Transferência de som em um CHAT
586. Como alterar o driver de acesso do access no
bde automaticamente
587. Emissao de NF e boleto
588. Gerando um arquivo HTML
589. Cuidado quando gravar arquivos binarios
590. Cuidados quando criar procedimentos e
funções com parametros
591. Como atribuir um valor inicial para uma
variável global
592. Como criar um form completo com botões
dinamicamente
593. Problemas Delphi X Imp. Xerox
594. Sublinhando no Canvas
595. Como fazer para alterar a largura do dbgrid
automaticamente
596. Exemplo de como pegar o nome de um
objeto ou janela
597. Instalando os componentes RXLIB 2.40 no
Delphi 3
598. Instalando os componentes RXLIB
2.50/2.60/2.75 no Delphi 4
599. Passando variáveis para o ReportSmith
600. Adiciona a barra invertida a um texto
selecionado
601. Como abrir um TComboBox sem clicá-lo
602. Como Calcular Digito Verificador de CNPJ e
CPF
603. Criando uma base de dados MS Access pelo
Delphi
604. Desenhando texto 3D no form com Canvas
605. Como saber há quanto tempo o WINDOWS
foi inicializado
606. Como alterar o tamanho do papel na
impressão
607. Como filtrar registros de uma tabela pelo mês
de um campo data
608. Otimizações SQL
609. Excluindo registros de uma tabela
610. Selecionando registros de uma tabela que
não existam em outra tabela
611. Uso da cláusula HAVING
612. Bloco PL/SQL para inserção de dados
613. Como selecionar um item de um listbox
614. Executa uma Url a partir do Netscape mesmo
que ele não seje o Browser padrão
615. Retorna a hora da criação de um diretório
616. Como fazer para que o ComboBox abra na
direcao desejada
617. função captura a tela e salva-a em um
Bitmap
618. Copia ou move arquivos usando a API do
Windows
619. converte o equivalente decimal para horas
620. Retorna um Stringlist com todas as
informações da tabela
621. Bloqueia uma Tabela paradox
622. Testa se a tabela esta bloqueada ou nao
623. Retorna o IP de sua máquina no momento
em que você está conectado
624. Remove caracteres de uma string deixando
apenas numeros
625. Transformar literal em extenso
626. Rotina para apagamento da senha do setup
627. Imprime o conteúdo de um TRichEdit
628. Como saber se estou conectado à internet
629. Acessando o banco de dados Oracle a partir
do Delphi
630. Como pegar a URL ativa no Browser
631. Compara dois arquivos textos
632. Procurando um arquivo em todo o HD
633. Como desabilitar o menu pop-up do
windows(Na area de trabalho)
634. Como inserir um item em um TreeView em
Run Time
635. Como chamar a pasta impressoras
636. Mudar Impressora padrão pelo nome
637. Função para gerar Log de Erros
638. Protegendo o seu programa e o seu bolso
639. MessageBox com o NÃO como default
640. Como verificar que sua aplicação não está
sendo utilizada
641. Como enviar mensagem para todos que estão
conectados na REDE WinNT
642. Criando um arquivo de texto
643. Problema com Null no Delphi 6
644. Foto no InterBase
645. Comandos para Threads
646. A melhor maneira de liberar um form da
memoria
647. Para ocultar em tempo de execução uma
coluna de um stringgrid
648. Como colocar uma unica linha de uma
stringgrid editavel
649. Como gravar as alterações feitas no DBGrid
em tempo de execução
650. Efeito legal no caption do form
651. Enter funcionando como Tab em toda a
aplicação
652. Mudando a cor dos componentes assim que
receber o foco
653. Como Instalar no Delphi o ActiveX do Flash
654. Como evitar que apareçam numeros
negativos na consulta
655. Como colocar imagens numa StatusBar
656. Como pegar o diretorio de uma ALIAS
657. Como trocar a cor do componente focado
658. Como instalar componentes 3
659. Não aparecer na barra e tb como não
aparecer no ctr+alt+del.
660. Impressão apartir de Consult
661. Procedimentos com parâmetros opcionais:
662. Exemplos de path via registro
663. Executar um programa do Windows
664. Como descobrir se você está conectado com
a Internet?
665. Como desabilitar as teclas Alt + F4
666. Para trocar as cores dos botoes do radiogroup
667. Como usar um frame em sua aplicação
668. Como trocar a cor do texto de uma coluna do
dbgrid
669. Deixando o EXE menor e mais rápido
670. Usando MessageBox
671. Efeito legal no Caption do Form 2
672. Criando tabela em tempo de execução 2
673. Criando tabelas em tempo de execução 2
674. Usando o Registro do Windows
675. Usando o Registro do Windows 2
676. Tabelas DBase acentudas em DOS, como
corrigir?
677. Nomes dos arquivos que estão sendo
executados:
678. Como usar a cláusula UNION em um Query:
679. Alterando o NetDir via programação:
680. Cuidados ao usar o OnExit (Parte I):
681. Cuidados ao usar o OnExit (Parte II):
682. Zerar Campo AutoIncremento:
683. Manipulando o Internet Explorer
684. Como posso saber a coluna que estou
posicionado no DBGrid?
685. Transformar inteiro em romanos
686. Como tabular um ListBox
687. Pesquisa incremental em uma listbox
688. Eliminando os hints de uma treeview
689. Retorna o dia da semana em formato string
690. Pega o path de um arquivo arrastado do
explorer
691. Como pegar a lista de favoritos do Internet
Explorer
692. Como fechar um arquivo de Help quando
encerro minha Aplicação
693. Como mudar a cor de uma regiao de Texto
RichEdit
694. Como utilizar código de barras no meu
sistema
695. Como copiar tabelas Paradox para Texto ou
DBase e vice-versa
696. Deletar um diretório inteiro de uma vez
697. Habilitar e desabiliar a senha do protetor de
tela
698. Sobrescrevendo um evento
699. Clicando um componente sem clicar nele
700. O Dilema do envio de e-mail
701. Como fazer para ajustar o tamanho da lista
de um combobox?
702. Como descobrir o código de uma tecla
pressionada?
703. Como Reindexar um Banco M$Access 2000?
704. Como alterar a Página Inicial do IE via
Programação
705. Sistemas Numéricos
706. Construindo Threads com Delphi
707. Validando formato de e-mail
708. Como pegar a posição do mouse na tela
709. Como tranformar de inteiro (Milisegundos)
em formato Timer
710. Obter a célula de um StringGrid que está sob
o cursor do mouse
711. Fechando todas as tabelas de um aplicativo
712. Retorna quantos dias tem um referido mes do
ano
713. Retorna a diferenca de dias entre duas datas
714. Converte um certo número de segundos em
horas já formatado
715. Como colocar um componente ComboBox em
um componente StringGrid
716. Colocar senha geral em um banco de dados
Access
717. Procedimento para pedir uma senha antes de
abrir o FormPrincipal
718. Corrigir Erros de campo AutoIncremento
719. Label escrita letra a letra
720. Função Split
721. Função que arredonda valores
722. Como vazar um form usando letras
723. Pesquisa de um string mudando o texto
724. Função para Abrir e Fechar Query
725. Código de Erros do BDE
726. 20 motivos alguns motivos para você adotar
o InterBase em sua empresa
727. 10 Passos para fazer o Interbase
728. Interrompendo o desligamento do Windows
729. Opções de Projeto
730. Melhorando a aparência do seu Hint
731. Criando e Distribuindo Aplicações Shareware
732. Os limites do InterBase
733. Alinha o título da barra de títulos a direita
734. Carrega os dados, salvos em um arquivo, em
um StringGrid
735. Executando o comando ARJ em um aplicativo
Delphi
736. Trabalhando com Strings
737. Atalhos de Teclado da IDE do Delphi
738. Lock de Registro
739. Como mudar o foco após digitar toda a data
740. 13 Pequenas modificações no Delphi
741. Macro no rxQuery
742. Como anda a lista de processos do windows
NT
743. Como adicionar uma linha formatada (cor,
negrito, etc) num RichEdit
744. Criando fontes no Delphi
745. Como colocar BitButton no messagedlg
746. Teclas de funções no Dbgrid
747. Detectando o tipo de Conexão com a internet
748. Comandos para Dial-up com Delphi
749. Como usar os arquivos QRP criados com
QuickReport
750. Como incrementar a Barra de Status
751. Função para Desligar o Windows 2000
752. Como fazer para um executavel se Auto-
Deletar
753. Funções de CRC
754. Funções para detectar o SoftIce
755. Como apagar uma imagem de um TImage
756. Baixando arquivos da internet
757. Criptografando Imagens
758. Compilar *.pas fora do Delphi
759. Validando Titulo de Eleitor
760. Função que retorna texto entre caracteres
761. Mover Timage sem que ele pisque
762. Como colocar Captions no DBNavigator
763. Como separar termos de uma string
764. Como arredondar um valor do tipo Float /
Double
765. Como transformar de uma Classe para outra
766. Selecionando vários objetos dentro de um
outro
767. Como colocar imagens em um TStatusBar
768. Validando CEP
769. Como obter uma string entre outras duas
770. Como passar parâmetros entre 2 forms
771. Transforma a imagem em negativo de
fotografia
772. Função para obter os termos de uma string
773. Função que deleta vários items de um listbox
774. Como ir para o final de um texto com o
Richedit
775. Como retornar quantidade de dias meses e
anos entre duas datas
776. Para chamar um HTMLHelp (.chm) a partir da
aplicação Delphi
777. Como adicionar items de menu
dinâmicamente
778. Mostrar todas as unidades mapeadas na
máquina.
779. Clonando um Form
780. Como formatar um TMemo ou TRichEdit em
formato HTML
781. Animando a abertura de um form
782. Alterando a cor dos TabSheet de um
PageControll
783. Como reduzir expressões if then else
784. Como saber quantas paginas vão ser
impressas com Quickrep
785. Rotina para criptografia mais absoluta
786. Exportando uma Tabela ou uma Query para
uma página HTML
787. Criando drivers ODBC através do Delphi
788. Tabela de Máscaras
789. Como evitar as mensagens de Warning do
Compilador
790. Selecionar todo o conteúdo de um Memo ou
RichEdit com as teclas Ctrl+A
791. Criar Código de Barras 2x5i
792. Exibindo imagens em caixas de mensagens
de Aplicações CLX
793. Como gerar numeros randomicos para
loterias
794. Função para Criar Subescrito e Sobrecrito
795. Como trocar o Glyph de um BitButton em
tempo de execução
796. Validar Inscrições Estaduais
797. InputBox para entrada de Senhas (com
caracter *)
798. Coloração Gradiente no Form
799. Como alterar a coluna Description do
IBConsole
800. Converter DBGrig em Html
801. Criar um programa para transferencia via ftp
Bookmarks na Unit.
Localizando um BreakPoint.
No prompt do Dos:
Ou
Hiperlinks
Tabelas Paradox
Para criar tabelas Paradox, siga os passos abaixo. Você deve
salvar as tabelas de um mesmo banco de dados na mesma
pasta, pois o Paradox trata a pasta onde estão as tabelas
como sendo o banco de dados.
Clique em File/New/Table
Escolha o tipo da nova tabela, Paradox 7
Aparece uma janela para que você defina a estrutura de
campos, índices e demais opções necessárias na criação
da tabela
Em Field Name, você escolhe o nome do campo, com
até 25 caracteres
Em Type, o Tipo do campo, com a barra de espaço ou o
botão direito do mouse você pode escolher o tipo a partir
de uma lista
Size é o tamanho do campo, usado somente em alguns
tipos de campos
Key especifica os campos que farão parte da chave
primária, que não pode se repetir e deve ser composta
pelos primeiros campos da tabela
Table Properties
Em Table Properties você define os vários aspectos de
configuração da tabela. Muitas dessas opções podem ser
implementadas no Delphi e vários programadores preferem
não usá-las no Database Desktop.
Opção Descrição
Validity Validações para os campos, como obrigatoriedade,
Checks valor mínimo e máximo
Table Lookup Indica que o valor atribuído a um determinado campo
tem que estar gravado em outra tabela
Secondary Cria índices secundários
Indexes
Referential Cria integridade referencial, geralmente utilizada em
Integrity relacionamentos de 1 para N.
Password Permite a criação de senhas, protegendo a tabela de
Security acesso não autorizado
Table Especificar o driver de língua utilizado pela tabela,
Language geralmente é o Pdox ANSI Intl850
Dependent Mostra todas as tabela dependentes através da
Tables integridade referencial
Tipos de Campos
Os principais tipos de campos são mostrados abaixo, mas
existem outros além desses. Os tamanhos marcados com
asterisco indicam que o campo pode guardar tamanhos
maiores que os informados, o que ultrapassar o tamanho será
guardado em um arquivo externo com a extensão MB.
Aliases
Um Alias é um nome lógico, um atalho para um banco de
dados. Todo o trabalho do Delphi com um banco de dados
pode ser feito baseado no Alias, de forma que para mudar de
banco de dados, só é necessário mudar o Alias. Para criar um
Alias você pode usar Database Explorer, o BDE Administrator
ou o próprio Database Desktop.
Database Explorer
Pode aparecer com os nomes Database Explorer ou SQL
Explorer. Nele você pode manipular os Aliases, navegar pelas
estruturas dos bancos de dados, alterar os dados das tabelas
e executar comandos SQL.
Para criar um Alias selecione o item Databases, clique em
Object/New, escolha o tipo do banco de dados, ou Standard
para dBase, Paradox e arquivos texto, depois digite um nome
do Alias, esse nome será usado pelo Delphi quando você
quiser acessar o banco de dados, finalmente defina as
propriedades do banco de dados na seção Definition, cada
banco de dados terá suas próprias definições.
BDE Administrator
Com o BDE Administrator você pode alterar a configuração
da BDE, por exemplo em Configuration/System/Init você tem
a propriedade Local Share que deve ser setada para True,
quando você quiser que a base de dados seja compartilhada
em uma rede. Além disso, você pode criar Aliases, como no
Database Explorer.
TDatabase
Esse componente permite a manipulação de um banco de
dados, através de um Alias da BDE ou a criação de um Alias
local, somente visível dentro da aplicação, esse componente
também permite o gerenciamento de transações, garantindo
uma integridade maior no projeto. Por essas e outras razões
o uso do componente Database é altamente recomendado
como opção para criação de Aliases.
Propriedades Descrição
AliasName Nome do Alias do banco de dados, usado quando
você criar um Alias da BDE
Connected Define se a conexão com o banco de dados está
ativa
DatabaseName Nome do Alias local a ser usado pelos outros
componentes do Delphi
DataSetCount Número de DataSets (Tabelas) abertos no banco de
dados
DataSets Lista com os DataSets abertos
DriverName Driver usado para criar um Alias local,
automaticamente cancela a propriedade AliasName
InTransaction Define se o Database está em transação
KeepConnectionDefine se a conexão com o banco de dados será
mantida, mesmo sem DataSets abertos
LoginPrompt Define se será mostrado o quadro de login padrão
da BDE
Params Parâmetros do banco de dados, com itens
semelhantes à seção Definition do Database
Explorer
TransIsolation Nível de isolamento da transação, define como uma
transação irá enxergar outra
Métodos Descrição
Close Encerra a conexão com o banco de dados, todos os
DataSets serão fechados
CloseDataSets Fecha todos os DataSets abertos, mas a conexão
não é encerrada
Commit Grava alterações feitas durante a transação
Open Abre a conexão com o banco de dados
Rollback Anula todas as alterações feitas durante a transação
StartTransaction Inicia uma transação
Eventos Descrição
OnLogin Evento usado quando você quiser escrever seu
próprio método de conexão com o banco de dados
Para acessar uma base de dados Access, você poderia usar
os valores mostrados na descrição textual a seguir.
AliasName = ‘Northwind’
DatabaseName = ‘Dados’
LoginPrompt = False
KeepConnection = True
Params.Strings = (
‘DATABASE NAME=C:\Meus Documentos\NorthWind.mdb’
‘USER NAME=paulo’
‘OPEN MODE=READ/WRITE’
‘LANGDRIVER=intl850’
‘PASSWORD=elvis’)
Para ajudar a preencher os parâmetros de um Database,
clique duas vezes sobre o componente e clique em Defaults,
todos os parâmetros defaults serão apresentados.
Para acessar uma base Paradox, use as propriedades
abaixo, note que para o Paradox, a única informação
realmente significante é o Path, a pasta onde estão as
tabelas.
AliasName = ‘DBDEMOS’
DatabaseName = ‘Dados’
LoginPrompt = False
KeepConnection = True
Params.Strings = (
‘PATH=d:\Borland\Delphi 3\Demos\Data’
‘ENABLE BCD=FALSE’
‘DEFAULT DRIVER=PARADOX’)
Após a criação do Alias da BDE ou do Alias local, usando o
componente TDatabase, o banco de dados está configurado
e pronto para ser usado.
Database Form Wizard
Após a configuração do banco de dados, a maneira mais
rápida, de se fazer uma janela de manutenção de dados é
através do Form Wizard no menu Database. Ao chegar no
Wizard são feitas uma série de perguntas que podem resultar
em uma janela simples ou Mestre/Detalhe. O acesso ao
banco de dados pode ser feito através de componentes
TTable ou através de SQL, com o componente TQuery,
usaremos o componente TTable. Todos os campos
selecionados aparecem na janela permitindo entrada de
dados através de componentes do tipo TDBEdit. Cada DBEdit
recebe um Label baseado no nome do campo na tabela
selecionada. Na Janela é incluído também um componente
para permitir a navegação e a manutenção dos dados, um
DBNavigator. O componente utilizado para fazer a ligação
entre os componentes visuais e o TTable é um TDataSource.
Geralmente os componentes TTable e TDataSource são
inseridos em DataModules, que são a base para a criação de
classes de dados. Sempre Após usar o Wizard, lembre-se de
mudar os nomes dos componentes, para que fiquem mais
claros.
Propriedades Descrição
Active Define se a tabela esta aberta ou fechada
BOF Informa se está no início da tabela
CanModify Define se a aplicação pode inserir, deletar ou alterar
registros
DatabaseName Nome do banco de dados onde está a tabela, deve
ser escolhido um Alias, que pode ser local
EOF Informa se está no fim da tabela
Exclusive Define se a tabela pode ser compartilhada por outro
usuário
FieldCount Número de campos da tabela
FieldDefs Lista com a Definição dos campos da tabela
Fields Lista de objetos do tipo TField, que representam os
campos da tabela
Filter String com uma condição de filtragem
Filtered Define se a tabela é filtrada
IndexFieldNamesNome dos campo de índice, usados para ordenar
os registros da tabela
IndexName Nome do índice atual, vazia quando o índice for a
chave primária
IndexDefs Lista com a definição dos índices
MasterFields Campos usados no relacionamento com a tabela
mestre
MasterSource DataSource da tabela mestre em uma relação
Mestre/Detalhe
Modified Define se o registro atual foi modificado
ReadOnly Define se a tabela é somente para leitura
RecNo Número do registro atual
RecordCount Número de registros
State Estado da tabela
TableName Nome da tabela
TableType Tipo da tabela
Método Descrição
AddIndex Cria um novo índice, a tabela deve ser exclusiva
Append Entra em modo de inserção e, ao gravar, o registro
será colocado no fim do arquivo
AppendRecord Insere um registro no final do arquivo através de
código
Cancel Cancela as alterações feitas no registro atual
Close Fecha a tabela
CreateTable Cria uma tabela, depende de FieldDefs e IndexDefs
Delete Exclui o registro corrente
DeleteIndex Exclui um índice
DeleteTable Exclui a tabela
DisableControls Desabilita a atualização dos controles visuais
Edit Permite a alteração dos campos do registro atual
EmptyTable Apaga todos os registro da tabela, para isso a
tabela não pode esta sendo compartilhada
EnableControls Habilita os controles visuais
FieldByName Acessa um campo, do tipo TField, pelo nome
FindKey Procura o registro com os valores exatos aos dos
parâmetros nos campos do índice atual
FindNearest Procura o registro com os valores mais
aproximados aos dos parâmetros nos índices
First Move para o primeiro registro
Insert Entra em modo de inserção de um novo registro na
posição atual
InsertRecord Adiciona um novo registro, já com os dados, na
posição atual
IsEmpty Define se a tabela está vazia
Last Move para o último registro
Locate Procura um registro, usando ou não índices, de
acordo com a disponibilidade
LockTable Trava a tabela
Lookup Procura um registro e retorna valores dos campos
deste
MoveBy Move um número específico de registros
Next Move para o próximo registro
Open Abre a tabela
Post Grava as alterações no registro atual
Prior Move para o primeiro registro
Refresh Atualiza a tabela com os dados já gravados
RenameTable Renomeia a tabela
UnlockTable Destrava a tabela
Evento Descrição
AfterCancel Após do método Cancel
AfterClose Após o fechamento da tabela
AfterDelete Após do método Delete
AfterEdit Após do método Edit
AfterInsert Após do método Insert
AfterOpen Após do método Open
AfterPost Após do método Post
AfterScroll Após mudar de registro
BeforeCancel Antes do método Cancel
BeforeClose Antes do fechamento da tabela
BeforeDelete Antes do método Delete
BeforeEdit Antes do método Edit
BeforeInsert Antes do método Insert
BeforeOpen Antes do método Open
BeforePost Antes do método Post
BeforeScroll Antes de mudar o registro
OnCalcFields Evento usado para calcular os valores dos campos
calculados
OnDeleteError Quando ocorre um erro ao chamar o método Delete
OnEditError Quando ocorre um erro ao chamar o método Edit
OnFilterRecord Evento usado com filtragem variável
OnNewRecord Quando a tabela entra em modo de inserção, não
deixa Modified igual a True
OnPostError Quando ocorre um erro ao chamar o método Post
Filtros
Usando o Filter, você pode filtrar os registro de uma tabela
usando uma expressão lógica, como nos exemplos abaixo.
Para tornar um filtro ativo, basta colocar Filtered igual a True.
Data = ‘20/04/1998’
(Data = ‘20/04/1998’) AND (Vendedor = ‘Gilherme Augusto da
Fonseca’)
(Nome > ‘A’) AND (Nome < ‘B’)
Contudo, se a condição de filtragem for muito variável, é
preferível usar um código como o mostrado abaixo no evento
OnFilterRecord da Table, para fazer uma filtragem dinâmica,
com a propriedade Filter vazia e Filtered igual a True.
Accept := TblData.Value = Date;
Ao filtrar uma tabela, a propriedade RecordCount da Table, só
mostra o número de registros que satisfazem ao filtro, como
se os outros registros nao existissem.
Alterando Registros
Para alterar registros em código, colocamos a tabela em
modo de edição, alteramos o valor dos campos e gravamos
as alterações, se for necessário.
with DtmPedidos do
begin
Tbl.Edit;
TblData.Value := Date;
TblHora.Value := Time;
Tbl.Post;
end;
Inserindo Registros
Para inserir registros em código você pode usar os métodos
AppendRecord e InsertRecord, caso você não precise de
algum campo, mesmo assim ele deve ser informado com o
valor Null.
DtmProd.Tbl.AppendRecord([Null,
EdtDescricao.Text, EdtPreco.Text]);
Localizando Registros
Para localizar registros você pode usar vários métodos, mas o
melhor deles é o Locate, no exemplo abaixo é feita uma
pesquisa exata.
if not DtmCli.Tbl.Locate(‘CodCli’, Edt.Text,
[]) then
ShowMessage(‘Cliente não encontrado.’);
Você também pode fazer uma pesquisa parcial e/ou sem
sensitividade de caso usando o terceiro parâmetro, que é um
conjunto de opções.
DtmCli.Tbl.Locate(‘Nome’, Edt.Text,
[loPartialKey, loCaseInsensitive]);
Se você precisar fazer uma pesquisa por mais de um campo,
separe os nomes dos campos por ponto e vírgula e use a
função VarArrayOf para criar um array com os valores que
você quer procurar.
if not DtmPed.Tbl.Locate(‘Vendedor;Data’,
VarArrayOf([EdtVendedor.Text, EdtData.Text]),
[loCaseInsensitive]) then ShowMessage(‘O
vendedor não realizou nenhuma venda nessa
data’);
Caso os campos pesquisados sejam indexados, a pesquisa
será muito mais eficiente, senão será criado um filtro
temporário da BDE para localizar os registros
Indexação
A indexação é usada para ordenar os registros da tabela,
para isso você deve escolher os campos pelos quais você
quer ordenar na propriedade IndexFieldNames, inclusive em
código, como mostrado abaixo, todos campos devem ser
indexados e separados por ponto e vírgula.
DtmCli.Tbl.IndexFieldNames := ‘Nomcli’;
DtmPed.Tbl.IndexFieldNames := ‘Data, Vendedor’;
Estados da Tabela
A propriedade State determina o estado das tabelas, os
principais estados são demonstrados abaixo, veja como os
métodos mudam o estado.
Verificando Alterações
Onde for necessário a verificação de alterações feitas em
uma Tabela, por exemplo no evento OnClose de um Form de
manutenção, você pode usar a propriedade Modified, como
mostrado no exemplo abaixo.
if DtmCli.Tbl.Modified then
if Application.MessageBox(‘Gravar
alterações?’, ‘Dados Alterados’,
MB_ICONQUESTION
+ MB_YESNO) = IDYES then
DtmCli.Tbl.Post
else
DtmCli.Tbl.Cancel;
Valores Default
Caso você queira especificar valores Default para os campos
de uma tabela, use o evento OnNewRecord, pois nesse
evento o registro não é marcado como modificado.
TblData.Value := Date;
Propriedades Descrição
Alignment Alinhamento do texto do campo nos
controles visuais
AsBoolean Valor do campo convertido para Boolean
AsCurrency Valor do campo convertido para Currency
AsDateTime Valor do campo convertido para DataTime
AsFloat Valor do campo convertido para Double
AsInteger Valor do campo convertido para Integer
AsString Valor do campo convertido para string
AsVariant Valor do campo convertido para Variant
Calculated Indica se o campo é calculado em tempo de
execução
CanModify Indica se um campo pode ser modificado
ConstraintErrorMessageMensagem de erro se a condição de
CustomConstraint não for satisfeita
CustomConstraint Condição de validação do campo
DataSet DataSet onde está o campo
DataSize Tamanho do campo, em Bytes
DataType Propriedade do tipo TFieldType, que indica o
tipo do campo
DefaultExpression Expressão com valor Default do campo para
novos registros
DisplayLabel Título a ser exibido para o campo
DisplayText Texto exibido nos controles visuais
associados ao campo
DisplayWidth Número de caracteres que deve ser usado
para mostrar o campo no controles visuais
EditMask Máscara de edição do campo
FieldKind Propriedade do tipo TFieldKind que indica o
tipo do campo, como Calculado ou Lookup
FieldName Nome do campo na tabela
FieldNo Posição física do campo na tabela
Index Posição do campo nos controles visuais
IsIndexField Indica se um campo é válido para ser usado
como índice
IsNull Indica se o campo está vazio
KeyFields Campo chave da tabela no relacionamento
com LookupDataSet, usado em campos
Lookup
Lookup Indica se um campo é Lookup
LookupCache Define se será usado cache para campos
Lookup
LookupDataSet DataSet onde está definido o valor do campo
Lookup
LookupKeyFields Campo chave do relacionamento em
LookupDataSet
LookupResultField Valor do campo, que será mostrado nos
controles visuais
ReadOnly Define se um campo é somente para leitura
Required Define se o campo é obrigatório
Size Tamanho físico do campo
Text Texto de edição do campo
Value Acesso direto ao valor do campo
Visible Define se um campo é visível
Eventos Descrição
OnChange Chamado quando o valor do campo é
mudado
OnSetText Chamado pelos controles visuais para
atribuir o texto digitado pelo usuário ao
campo
OnGetText Chamado para formatar o texto de exibição
do campo
OnValidate Validação do valor atribuído ao campo, caso
o valor não seja válido, gere uma exceção
Método Descrição
Assign Atribui um valor de um campo a outro,
inclusive nulo
FocusControl Seta o foco para o controle visual ligado ao
campo nos Forms
Clear Limpa o conteúdo do campo
Estão listadas abaixo algumas classes que realmente iremos
manipular no tratamento dos campos de uma tabela, são
classes descendentes de TField.
TStringField TBlobField TTimeField
TSmallintField TIntegerField TBytesField
TFloatField TWordField TVarBytesField
TCurrencyField TAutoIncField TGraphicField
TBooleanField TBCDField TMemoField
TDateField TDateTimeField
Em alguns desses campos você pode encontrar as
propriedades mostradas abaixo, que não estão presentes em
TField.
Propriedades Descrição
MaxValue Valor máximo para o campo
MinValue Valor mínimo para campo
DisplayFormat Formato de apresentação do campo, como ,0.00”
%” ou ,0.##” Km”
EditFormat Formato de edição do campo
Currency Define se um campo é monetário
DisplayValues Usado com campos Boolean, define o texto para
True e False, como Sim;Não
Métodos Descrição
LoadFromFile Carrega o conteúdo do campo de um arquivo
SaveToFile Salva o conteúdo do campo para um arquivo
Para acessar os campo de uma tabela, existem várias
abordagens, como mostrado abaixo..
TblDescricao.Value := TblVendedor.Value + ‘ em
‘ + TblData.AsString;
Tbl[‘Descricao’] := Tbl[‘Vendedor’] + ‘ em ‘ +
Tbl[‘Data’].AsString;
Tbl.FieldByName(‘Descricao’).Value :=
Tbl.FieldByName(‘Vendedor’).Value + ‘ em ‘ +
Tbl.FieldByName(‘Data’).AsString;
Tbl.Fields[5].Value := Tbl.Fields[3].Value + ‘
em ‘ + Tbl.Fields[4].AsString;
Conversão de Tipos
A conversão de tipo de um campo pode ser feita através as
propriedades tipo As…, como AsString.
DtmPed.TblData.AsString := EdtData.Text;
Validação
Para validar os valores de um campo, você pode usar a
propriedade CustomConstraint, por exemplo para garantir que
a quantidade de um item seja maior que zero, use em
CustomConstraint Quantidade > 0, e em CustomConstraint
coloque a mensagem para o usuário caso a condição seja
falsa. Outra forma, mais flexível, é usando o evento
OnValidate, com um código como abaixo, onde é gerada uma
exceção para cancelar a atribuição do valor ao campo.
if TblQuantidade.Value <= 0 then
raise Exception.Create(‘Quantidade deve ser
maior que zero.’);
Formatação Personalizada
Caso queira fazer uma formatação personalizada do campo,
pode usar os eventos OnGetText e OnSetText. Por exemplo,
se tiver um campo Estado, e quiser que quando o valor do
campo for C fosse mostrado Casado e S, Solteiro, no evento
OnGetText use um código como o abaixo.
if TblEstado.Value = ‘C’ then
Text := ‘Casado’
else if TblEstado.Value = ‘S’ then
Text := ‘Solteiro’;
Como controle visual para o usuário escolher o valor do
campo, você poderia usar o DBComboBox, com Solteiro e
Casado na propriedade Items, e no evento OnGetText do
campo o código mostrado abaixo.
if Text = ‘Casado’ then
TblEstado.Value := ‘C’
else if Text := ‘Solteiro’ then
TblEstado.Value = ‘S’;
Campos Calculados
Para criar campos calculados, clique com o direito no Fields
Editor e escolha New Field, no quadro NewField, digite o
nome do campo, o nome do objeto será automaticamente
informado, o tipo do campo, seu tamanho e escolha
Calculated em Field type.
Para colocar um valor nesse campo usaremos o evento
OnCalcFields do componente TTable, em nenhuma outra
parte os valores desses campos podem ser alterados.
O código do evento OnCalcFields deve ser enxuto, pois este
é chamado várias vezes durante a edição de um registro e
um procedimento pesado pode comprometer a performance
do sistema.
procedure TDtmAluno.TblCalcFields(DataSet:
TDataSet);
begin
if TblFaltas.Value >
DtmTurma.TblMaxFaltas.Value then
TblSituacao.Value := ‘Evadido’
bTblNota.Value >= 7 then
TblSituacao.Value := ‘Aprovado’
else
TblSituacao.Value := ‘Retido’
end;
Campos Lookup
Para fazer um relacionamento, às vezes precisamos criar um
campo de descrição, por exemplo em uma biblioteca, na
tabela de empréstimos, temos o código do Livro, mas
gostaríamos de mostrar o Título, esses campos são
chamados de campos Lookup.
Para criar um campo Lookup, siga os passos abaixo,
tomando como exemplo o caso do livro no empréstimo.
Abra o Fields Editor do Table desejado, Empréstimos
Clique com o direito e escolha New Field
No quadro New Field, escolha as propriedades do
campo como descrito em campos calculados, mas em
Field type, escolha Lookup
Em Key Fields escolha o campo da tabela que faz parte
do relacionamento, CodLivro
DataSet é a tabela onde está a descrição, Livros
Em Lookup Keys, escolha o campo de DataSet que faz
parte do relacionamento, CodLivro
Finalmente, escolha em Result field o campo de DataSet
que vai ser mostrado para o usuário, Título
Propriedade Descrição
AutoEdit Define se a tabela entrará em modo de edição assim
que o usuário digitar novos valores nos controles
DataSet DataSet ao qual o TDataSource faz referência
Evento Descrição
OnDataChange Ocorre quando o DataSet é alterado, ao mudar de
registro ou mudar os valores dos campos
OnStateChangeOcorre quando o estado do DataSet é alterado
OnUpdateData Ocorre antes de uma atualização
Propriedades Descrição
VisibleButtons Define os botões que serão visíveis
Hints Hints exibidos pelos botões
ConfirmDelete Define se será solicitado uma confirmação antes da
exclusão
Eventos Descrição
BeforeAction Quando um botão do Navigator é pressionado, antes
da ação ser executada
OnClick Quando um botão do Navigator é pressionado,
depois da ação ser executada
TDBGrid
Mostra os registros de uma tabela em forma de grade, cada
coluna é um campo e cada registro, uma linha.
Propriedades Descrição
Columns Lista do tipo TDBGridColumns, com as colunas da
Grid, cada item da lista é do tipo TColumn
Fields Lista de objetos TField mostrados nas colunas
Options Set com as opções da Grid, como ConfirmDelete,
MultiSelect, ColumnResize
SelectedField Campo da coluna selecionada
SelectedIndex Índice da coluna selecionada
SelectedRows Lista do tipo TBookmarkList, com os registros
selecionados em uma Grid com MultiSelect
TitleFont Fonte do título das colunas
FixedColor Cor Fixa, usada nas colunas e indicadores
Eventos Descrição
OnCellClick Ao clicar em uma célula da Grid
OnColEnter Quando uma célula de alguma coluna da Grid
recebe o foco
OnColExit Quando uma célula de alguma coluna da Grid
perde o foco
OnColumnMoved Quando o usuário mover uma coluna
OnDrawDataCell Evento usado para personalizar a forma de
desenhar os dados que são apresentados na Grid
OnEditButtonClick Ao clicar no botão de edição de uma célula,
mostrado pela propriedade ButtonStyle da coluna
OnTitleClick Ao clicar no título das colunas
TColumn
Item de uma lista TDBGridColumns, usada na propriedade
Columns da Grid, objetos desse tipo representam uma coluna
da Grid. Às vezes as propriedades definidas para o campo
sobrepõem as propriedades
Propriedades Descrição
ButtonStyle Botão mostrado ao editar as células da coluna
Field Objeto TField ligado à coluna
FieldName Nome do campo ligado à coluna
PickList TStrings com os itens da lista DropDown usada nas
células da coluna
Title Propriedade do tipo TColumnTitle com as opções do
título da coluna
TDBText, TDBEdit, TDBMemo,
TDBListBox, TDBComboBox,
TDBImage, TDBRichEdit
Controles genéricos ligados a um campo de uma tabela.
Propriedades Descrição
DataField Campo ao qual o controle está ligado
TDBCheckBox
Usado em campos que podem receber apenas dois valores,
como campos lógicos.
Propriedades Descrição
ValueChecked Valor a ser armazenado quando está selecionado
ValueUncheckedValor a ser armazenado quando não está
selecionado
TDBRadioGroup
Mostra algumas opções para o preenchimento de um campo.
Propriedades Descrição
Values Valor a ser armazenado para cada botão de rádio
TDBLookupListBox,
TDBLookupComboBox
Preenche um campo com dados contidos em outra tabela. Se
o campo mostrado nesses componentes for um campo
Lookup, você não precisa especificar nenhuma das
propriedades abaixo, apenas DataSource e DataField.
Propriedades Descrição
ListSource DataSource que contém os valores a serem exibidos
na lista
ListField Campo de ListSource que será exibido
KeyField Campo de ListSource usado no relacionamento
Exercícios
1. Crie uma aplicação que cadastre os Clientes de uma
empresa e as Compras feitas por estes Clientes, permita
inclusão, alteração, exclusão e consulta aos dados
cadastrados. Na janela principal fica o cadastro de Clientes,
com a grade de visualização de suas Compras, crie também
uma Janela para localizar Clientes por Nome.
A tabela de clientes deve ter Nome, Endereço, Bairro, Cidade,
Estado, CEP e Telefone, defina também índices para
melhorar a localização de clientes por Nome. Na tabela de
Compras, deseja-se saber a Data, Produtos e Valor, assuma
que cada compra tem um Produto apenas. Como foi
mencionado, as compras serão cadastradas pelo cliente
atual, crie a relação Mestre/Detalhe entre Clientes e
Compras.
O Form de localização de Clientes deve permitir pesquisa
Nome, da mesma forma da questão anterior.
2. Uma academia de ginástica deseja manter um controle
maior sobre seus Alunos, para isso ela organizou os clientes
em turmas. Os dados de uma Turma são Número de alunos,
Horário da aula, Duração da aula, Data inicial, Data final e
Instrutor. Deve ser feita também uma tabela de instrutores
para evitar a digitação repetitiva do Nome. Os dados dos
Alunos são Matrícula, Data de Matrícula, Nome, Endereço,
Bairro, Cidade, Estado, Telefone, Data de nascimento, Altura
e Peso. Crie um banco de dados, normalizado, para guardar
essas informações.
No cadastro de Turmas, o Horário de aulas deve ser entre
7:00 e 18:00, a Duração não pode ser maior que 2 horas e a
Data Final tem que ser, no mínimo 5 dias após a Inicial. Esse
cadastro deve ser ordenado primeiro pela Data Final, em
ordem decrescente e depois pelo Horário, em ordem
crescente. As turmas já encerradas não devem ser mostradas
no cadastro, mas crie um arquivo morto com as turmas já
encerradas, onde os dados não possam ser alterados. Deve
ser possível também procurar o Instrutor pelo Nome, usando
um ComboBox, com os registros da tabela de Instrutores.
No cadastro de Alunos, a matrícula é Auto-incremental, a
Data de Matrícula deve ser, obrigatoriamente, a Data do
sistema e deve ser criado um campo calculado com o peso
ideal do cliente, altura menos 1,15.
Comandos de Consulta ao Esquema
Devemos ressaltar que a linguagem SQL é utilizada
tanto pelos profissionais responsáveis pelos dados,
onde é ressaltada a figura do Administrador do Banco
de Dados e dos Analistas de Dados, como também
pelos desenvolvedores de Aplicações. Enquanto
àqueles estão preocupados com o desempenho,
integridade do Banco de Dados e utilizam toda gama de
recusos disponíveis no SQL, estes estão preocupados
apenas em “transformar dados em informações”,
portanto para os desenvolvedores costuma-se dizer que
conhecer o “select” já basta. Em nosso curso
enfatizaremos a importância de TODOS os comandos
do SQL, mas sabemos de antemão que os professores
responsáveis pelas linguagens IDEO, VB e Delphi,
ressaltarão a preponderância da instrução “select”, que
será apresentada a seguir e não no final do curso de
SQL como geralmente acontece, pelo fato de que
diversas disciplinas necessitam especificamente deste
comando, que passaremos a apresentar:
1) Seleção de todas os campos (ou colunas) da
tabela de Departamentos.
Resp:
SELECT * FROM DEPT;
O exemplo utiliza o coringa “*” para selecionar as
colunas na ordem em que foram criadas. A instrução
Select, como pudemos observar seleciona um grupo de
registros de uma (ou mais) tabela(s). No caso a
instrução From nos indica a necessidade de
pesquisarmos tais dados apenas na tabela Dept.
Where como base das Restrição de
tuplas.
A cláusula “where” corresponde ao operador restrição
da álgebra relacional. Contém a condição que as tuplas
devem obedecer a fim de serem listadas. Ela pode
comparar valores em colunas, literais, expressões
aritméticas ou funções.
A seguir apresentamos operadores lógicos e
complementares a serem utilizados nas expressões
apresentadas em where.
Operadores lógicos
Operador Significado
= Igual a
> Maior que
>= Maior que ou igual a
< Menor que
<= Menor que ou igual a
Exemplos:
SELECT EMPNOME, EMPSERV
FROM EMP
WHERE DEPNUME > 10;
SELECT EMPNOME, EMPSERV
FROM EMP
WHERE EMPSERV = ‘GERENTE’;
O conjunto de caracteres ou datas devem estar entre
apóstrofes (‘) na cláusula “where”.
2) Selecione todos os departamentos cujo
orçamento mensal seja maior que 100000. Apresente
o Nome de tal departamento e seu orçamento anual,
que será obtido multiplicando-se o orçamento
mensal por 12.
Resp: Neste problema precisamos de uma expressão
que é a combinação de um ou mais valores, operadores
ou funções que resultarão em um valor. Esta expressão
poderá conter nomes de colunas, valores numéricos,
constantes e operadores aritméticos.
SELECT DEPNOME, DEPORCA * 12
FROM DEPT
WHERE DEPORCA > 100000;
3) Apresente a instrução anterior porém ao invés
dos “feios” DepNome e DepOrca, os Títulos
Departamento e Orçamento.
Resp: Neste exemplo deveremos denominar colunas por
apelidos. Os nomes das colunas mostradas por uma
consulta, são geralmente os nomes existentes no
Dicionário de Dado, porém geralmente estão
armazenados na forma do mais puro “informatiquês”,
onde “todo mundo” sabe que CliCodi significa Código do
Cliente. É possível (e provável) que o usuário
desconheça estes símbolos, portanto devemos os
apresentar dando apelidos às colunas “contaminadas”
pelo informatiquês, que apesar de fundamental para os
analistas, somente são vistos como enigmas para os
usuários.
SELECT DEPNOME “DEPARTAMENTO”, DEPORCA *
12 “ORCAMENTO ANUAL”
FROM DEPT
WHERE DEPORCA > 100000;
4) Apresente todos os salários existentes na
empresa, porém omita eventuais duplicidades.
Resp: A cláusula Distinct elimina duplicidades,
significando que somente relações distintas serão
apresentadas como resultado de uma pesquisa.
SELECT DISTINCT EMPSERV
FROM EMP;
5) Apresente todos os dados dos empregados,
considerando sua existência física diferente de sua
existência lógica (ou seja devidamente inicializado).
Resp: Desejamos um tratamento diferenciado para
valores nulos. Qualquer coluna de uma tupla que não
contenha informações é denominada de nula, portanto
informação não existente. Isto não é o mesmo que
“zero”, pois zero é um número como outro qualquer,
enquanto que um valor nulo utiliza um “byte” de
armazenagem interna e são tratados de forma
diferenciada pelo SQL.
SELECT EMPNOME, EMPSALA + EMPCOMI
FROM EMP;
SELECT EMPNOME, NVL(EMPSALA,0) +
NVL(EMPCOMI,0)
FROM EMP;
Obs: a função “NVL” é utilizada para converter valores
nulos em zeros.
6) Apresente os nomes e funções da cada
funcionário contidos na tabela empresa, porém
classificados alfabeticamente (A..Z) e depois
alfabeticamente invertido (Z..A).
Resp: A cláusula Order By modificará a ordem de
apresentação do resultado da pesquisa (ascendente ou
descendente).
SELECT EMPNOME, EMPSERV
FROM EMP
ORDER BY EMPNOME;
SELECT EMPNOME, EMPSERV
FROM EMP
ORDER BY EMPPNOME DESC;
Nota: Também é possível fazer com que o resultado da
pesquisa venha classificado por várias colunas. Sem a
claúsula “order by” as linhas serão exibidas na
sequência que o SGBD determinar.
7) Selecione os Nomes dos Departamentos que
estejam na fábrica.
Resp:
SELECT DEPNOME
FROM DEPT
WHERE DEPLOCA = “SAO PAULO”;
O exemplo exigiu uma restrição (São Paulo) que nos
obrigou a utilizar da instrução Where. Alguns analistas
costumam afirmar em tom jocoso que SQL não passa
de
“Selecione algo De algum lugar Onde se verificam tais
relações”
Acreditamos que esta brincadeira pode ser útil ao
estudante, na medida em que facilita sua compreensão
dos objetivos elementares do SQL.
Demais Operadores
Operador Significado
between…and… entre dois valores (inclusive)
in (….) lista de valores
like com um padrão de caracteres
is null é um valor nulo
Exemplos:
SELECT EMPNOME, EMPSALA
FROM EMP
WHERE EMPSALA BETWEEN 500 AND 1000;
SELECT EMPNOME, DEPNUME
FROM EMP
WHERE DEPNUME IN (10,30);
SELECT EMPNOME, EMPSERV
FROM EMP
WHERE EMPNOME LIKE ‘F%’;
SELECT EMPNOME, EMPSERV
FROM EMP
WHERE EMPCOMI IS NULL;
O símbolo “%” pode ser usado para construir a pesquisa
(“%” = qualquer sequência de nenhum até vários
caracteres).
Operadores Negativos
Operador Significado
<> diferente
not diferente da coluna
nome_coluna =
not não maior que
nome_coluna >
not between não entre dois valores informados
not in não existente numa dada lista de valores
not like diferente do padrão de caracteres informado
is not null não é um valor nulo
Onde:
REPORTTOP - O que sera impresso no topo do
relatório.
PAGETOP - Impresso em cada topo de pagina.
TOP - Impresso em cada Topo do Sort-Grupo do
relatório.
DETAIL - O que sera impresso em cada linha.
NONE - Se não tiver resultado o select, não sera
impresso o relatório.
BOTTOM - Impresso em cada Bottom do Sort-
Grupo do relatório
PAGEBOTTOM - O que sera impresso no rodapé
de cada pagina.
REPORTBOTTOM - O que sera impresso no
rodape do relatório.
Formatos:
%C - caracter
%D - data
y - ano,
n - mes numérico,
a - mes alfanumérico,
d - dia,
j - dia e ano juliano
Exemplo: %D”dd/mm/yy”
%I - inteiro
%F - ponto flutuante
%FSZ onde: S - separador de 3 digitos e decimal
point
Z - zeros serão suprimidos
%Q - data
%J - Hora
h - hora, m - minutos, s - segundos
%T - hora
E temos as funções: TOTAL, AVERAGE,
MAXIMUM, MINIMUM.
Texto Para Iniciantes
Introdução à Programação
Caso você já tenha uma base de programação pode
pular esta parte, ou pode lê-la caso se sinta inseguro
quanto ao seu conhecimento.
Bem, em primeiro lugar, o que este guia exige é uma
noção de comandos básicos que todo (ou quase todo)
tipo de linguagem exige.
Note que os exemplos serão baseados na programação
Delphi, e não qualquer linguagem.
Variáveis
Variável é um nome conhecido por qualquer
programador (ou pelo menos deveria ser), este nome
significa um endereço na memória onde um certo valor
fica guardado. Vejamos um exemplo: se você declara a
variável i:
var i:integer;
(“var” é nome usado para declarar uma variável em
Delphi, “integer” é o tipo de informação que ela deverá
armazenar) daí você pode estabelecer um valor para i:
i := 12;
procedure ShowDate;
begin
TForm1.Timer1Timer(Sender);
Timer1.Enabled := True;
end;
procedure NShowDate;
begin
Timer1.Enabled := False;
Application.Title := ‘Título do
Aplicativo’;
end;
Este exemplo considera que o aplicativo possua um
relógio que atualiza de tempos em tempos (a cada 250
milésimos de segundo por exemplo). Este é desabilitado
quando o formulário é restaurado.
Undo na caixa de texto (Memo)…
Use o seguinte código para Desfazer a última ação em
uma caixa de Texto (Memo):
Memo1.Perform(EM_UNDO, 0, 0);
o valor retornado de Memo1.Perform(EM_CANUNDO,
0, 0) será diferente de zero se o comando de Desfazer
estiver disponível.
Pegando a posição do cursor…
Use o seguinte código para ver a posição do cursor na
tela, ele é muito útil quando o evento usado não possui
como parâmetros “X” e “Y”:
procedure GetPosition (var X; var Y);
var CPos: TPoint;
begin
GetCursorPos(CPos);
X := CPos.X;
Y := CPos.Y;
end;
.
Variáveis Globais
As variáveis abaixo são globais, declaradas da Interface
da Unit. Podem ser acessadas por qualquer Unit
usuária.
var
I: Integer;
Usuario: string;
A, B, Soma: Double;
Ok: Boolean;
Variáveis Locais
As variáveis abaixo são locais ao método, ou seja elas
só existem dentro do método, não podem ser acessadas
de fora, mesmo que seja na mesma Unit. Na verdade
essas variáveis são criadas quando o método é
chamado e destruídas quando ele é encerrado, seu
valor não é persistente.
procedure
TFrmExemplo.BtnTrocarClick(Sender:
TObject);
var
Aux: string;
begin
Aux := EdtA.Text;
EdtA.Text := EdtB.Text;
EdtB.Text := Aux;
end;
3.0 Atributos
Os atributos são variáveis de instância. Para declarar
um atributo em uma classe basta definir o identificador e
o tipo do atributo na declaração da classe, feita na
seção type da Interface da Unit, como abaixo.
type
TFrmSomar = class(TForm)
private
{ Private declarations }
A, B: Double;
public
{ Public declarations }
Soma: Double;
end;
4.0 Encapsulamento
Os principais níveis de visibilidade dos atributos e
métodos de uma classe são mostrados abaixo.
Nivel Visibilidade
Os itens declarados nesse nível só podem ser acessados na
Private mesma unit.
5.0 Classes
Classes são tipos de objetos, uma classe é declarada na
cláusula type da seção interface e os métodos são
definidos na seção implementation. Examine o código
de um Form para identificar os elementos de sua classe.
interface
type
TFrmSomar = class(TForm)
EdtA: TEdit;
EdtB: TEdit;
BtnSoma: TButton;
procedure BtnSomaClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
procedure TFrmSoma.BtnSomaClick(Sender:
TObject);
begin
ShowMessage(EdtA.Text + EditB.Text);
end;
6.0 Objetos
Um Objeto é tratado como uma variável cujo tipo é uma
classe. A declaração de objetos é igual à declaração de
uma variável simples, tendo no lugar do tipo a classe do
objeto.
var
FrmSomar: TFrmSomar;
7.0 Literais
Valores literais são valores usados em atribuições e
expressões. Cada tipo tem uma sintaxe diferente.
Tipo Definição
Seqüência de dígitos decimais (0 a 9),
Inteiro
sinalizados ou não
Inteiro Seqüência de dígitos hexadecimais (0 a F),
Hexadecimal precedidos por um sifrão ($)
Igual ao tipo Inteiro, mas pode usar
Real
separador decimal e notação científica
Letra entre apóstrofos ou o caracter #
Caractere seguido de um número inteiro entre 0 e
255 (ASCII)
Seqüência de caracteres delimitado por
String
apóstrofos
8.0 Constantes
São declaradas na seção const, podem ser usadas
como variáveis, mas não podem ser alteradas.
Geralmente o nome das constantes é escrito em letras
maiúsculas e na declaração dessas constantes não é
indicado o tipo.
const
G = 3.94851265E-19;
NUM_CHARS = ‘0123456789’;
CR = #13;
SPACE = ‘ ‘;
MAX_VALUE = $FFFFFFFF;
Constantes Tipadas
Na verdade, constantes tipadas são variáveis
inicializadas com valor persistente, que podem ser
alteradas normalmente, como qualquer variável. A única
diferença de sintaxe entre constantes tipadas e simples
é que o tipo da constante é indicado explicitamente na
declaração. Se uma constante tipada for declarada
localmente, ela não será destruída quando o método for
encerrado. Para diferenciar das constantes normais,
costuma-se declarar estas com letras de caso variável,
como abaixo.
const
Cont: Integer = 1;
Peso: Double = 50.5;
Empresa: string = ‘SENAC’;
9.0 Instruções
Os programas são compostos por instruções, que são
linhas de código executável. Exemplos de instruções
simples são atribuições, mensagens entre objetos,
chamadas de procedimentos, funções e métodos, como
mostradas abaixo. As instruções podem ser divididas
em várias linhas, o que indica o fim de uma instrução é o
ponto e vírgula no final. Quando uma instrução é
quebrada, costuma-se dar dois espaços antes das
próximas linhas, para melhorar a leitura do código.
Caption := ‘Gabba Gabba Hey!’;
Form2.ShowModal;
Application.MessageBox(‘Você executou uma
operação ilegal, o programa será
finalizado.’,
‘Falha geral’, MB_ICONERROR);
Você pode usar várias instruções agrupadas em uma
instrução composta, como se fosse uma só instrução.
Uma instrução composta delimitada pelas palavras
reservadas begin e end. Toda instrução, simples ou
composta, é terminada com um ponto-e-vírgula.
if CheckBox1.Checked then
begin
ShowMessage(‘O CheckBox será
desmarcado.’);
CheckBox1.Checked := False;
end;
Estilo de Codificação
As instruções e todo o código de uma Unit devem ser
distribuídos para facilitar o máximo a leitura. Para isso,
podemos usar a indentação, geralmente de dois
espaços para indicar os níveis de código. Procure criar
um estilo próprio, que melhor se molde à sua realidade.
Se for desenvolver em grupo, é melhor que todos usem
o mesmo estilo para evitar confusões.
10.0 Comentários
Existem 3 estilos de comentário no Delphi, como
mostrado abaixo.
(* Comentário do Pascal Padrão *)
{ Comentário do Turbo Pascal }
// Comentário de linha do C++
Cuidado com as diretivas de compilação, pois elas são
delimitadas por chaves e podem ser confundidas com
comentários. A diretiva de compilação mostrada abaixo
é incluída em todas as Units de Forms.
{$R*.DFM}
11.0 Tipos de Dados Padrão
O Delphi trata vários tipos de dados padrão, segue uma
descrição sucinta desses tipos.
Tipos Inteiros
São tipos numéricos exatos, sem casas decimais. O tipo
Integer é o tipo inteiro padrão.
Tipos Reais
São tipos numéricos com casas decimais. O tipo Double
é o tipo real padrão.
Tipos Texto
Os tipos texto podem operar com caracteres simples ou
grupos de caracteres. O tipo texto padrão é o tipo string.
Tipo Descrição
Char Um único caractere ASCII
Texto alocado dinamicamente, pode ser limitado a
String
255 caracteres conforme configuração
String terminada em nulo (#0), usada geralmente
PChar
nas funções da API do Windows
Função Descrição
Compara 2 strings sem sensitividade
AnsiCompareText
de maiúsculas/minúsculas
Converte todas as letras de uma
AnsiLowerCase
string para minúsculas
Converte todas as letras de uma
AnsiUpperCase
string para maiúsculas
Copy Retorna parte de uma string
Delete Apaga parte de uma string
Insert Insere uma string em outra
Length Número de caracteres de uma string
Pos Posição de uma string em outra
Remove todos os espaços de uma
Trim
string
Remove os espaços à esquerda de
TrimLeft
uma string
Remove os espaços à direita de uma
TrimRight
string
Format Formata uma string com uma série de
argumentos de vários tipos
Função Descrição
Dec Decrementa variável ordinal
Inc Incrementa variável ordinal
Odd Testa se um ordinal é ímpar
Pred Predecessor do ordinal
Succ Sucessor do ordinal
Ordem de um valor na faixa de valores de
Ord
um tipo ordinal
Low Valor mais baixo na faixa de valores
High Valor mais alto na faixa de valores
Rotina Descrição
Date Retorna a data do sistema
Now Retorna a data e hora do sistema
Time Retorna a hora do sistema
Retorna o dia da semana de uma data
DayOfWeek
especificada
Decodifica um valor TDateTime em Words
DecodeDate
de dia, mês e ano
Decodifica um valor TDateTime em Words
DecodeTime
de hora, minuto, segundo e milissegundos
Retorna um TDateTime a partir de Words
EncodeDate
de dia, mês e ano
Retorna um TDateTime a partir de Words
EncodeTime
de hora, minuto, segundo e milissegundos
Rotina Descrição
Chr Byte em Char
StrToInt String em Integer
IntToStr Integer em String
String em Integer, com um valor default
StrToIntDef
caso haja erro
IntToHex Número em String Hexadecimal
Arredonda um número real em um
Round
Integer
Trunc Trunca um número real em um Integer
StrToFloat String em Real
FloatToStr Real em string
Número real em string usando uma
FormatFloat
string de formato
TDateTime em string de data, de
DateToStr acordo com as opções do Painel de
Controle
StrToDate String de data em TDateTime
TimeToStr TDateTime em Strind de Hora
StrToTime String de hora em TDateTime
DateTimeToStr TDateTime em string de data e hora
StrToDateTime String de data e hora em TDateTime
FormatDateTime TDateTime em string usando uma
string de formato
Qualquer tipo em outro usando
VarCast
argumentos do tipo Variant
VarAsType Variante em qualquer tipo
Val String em número, real ou inteiro
Str Número, real ou inteiro, em String
var
A, B, Soma: Bouble;
begin
A := StrToFloat(EdtA.Text);
B := StrToFloat(EdtB.Text);
Soma := A + B;
ShowMessage(Format(‘%f + %f = %f’, [A, B,
Soma]);
end;
13.0 Expressões
Uma expressão é qualquer combinação de operadores,
variáveis, constantes, valores literais e chamadas de
funções que resultem em um valor de determinado tipo.
Uma expressão é usada sempre que precisamos de
uma valor que possa ser obtido por uma expressão.
A + 12 * C
Date - 4
StrToInt(Edit1.Text + Edit2.Text)
StrToDate(Edit2.Text) -
StrToDate(Edit1.Text)
12 * A / 100
A < B
14.0 Operadores
Os operadores são usados em expressões e a ordem
em que as expressões são executadas depende da
precedência desses operadores. Veja abaixo a lista de
operadores em ordem descendente de precedência.
Operador Descrição
Operadores Unários
@ Endereço
not Não booleano ou bit voltado para não
Operadores Multiplicativos e de direção de Bit
* Multiplicação ou interseção de conjuntos
/ Divisão de Real
div Divisão de Inteiro
mod Resto de divisão de Inteiros
as TypeCast seguro quanto ao tipo (RTTI)
E booleano ou bit voltado para e
and
shl Deslocamento de bits à esquerda
shr Deslocamento de bits à direita
Operadores Aditivos
+ Adição ou união de conjuntos
- Subtração ou diferença de conjuntos
or Ou booleano ou bit voltado para ou
xor Ou exclusivo booleano ou bit voltado para ou
exclusivo
Operadores Relacionais
= Igual
<> Diferente
< Menor
> Maoir
<= Menor ou igual
>= Maior ou igual
in Pertinência a conjuntos
is Compatibilidade de tipos (RTTI)
19.0 With
Usado para facilitar o acesso às propriedades e
métodos de um objeto.
with Edt do
begin
CharCase := ecUpperCase;
MaxLenght := 10;
PasswordChar := ‘*’;
Text := ‘Brasil’;
end;
20.0 Self
Self é usado quando se quer referenciar a instância
atual da classe. Se você precisar referenciar a instância
atual de uma classe, é preferível usar Self em vez de
usar o identificador de um Objeto, isso faz com que o
código continue funcionando para as demais instâncias
da classe e em seus descendentes.
21.0 Criando e Destruindo Objetos
Antes de tudo, você deve declarar o objeto, se quiser
referenciá-lo. Para criá-lo, use o método Create, que é
um método de classe. Para você usar um método de
classe, referencie a classe, não o Objeto, como
mostrado abaixo.
var
Btn: TBitBtn;
begin
Btn := TBitBtn.Create(Self);
With Btn do
begin
Parent := Self;
Kind := bkClose;
Caption := ‘&Sair’;
Left := Self.ClientWidth - Width - 8;
Top := Self.ClientHeight - Height - 8;
end;
end;
Porém, se você não precisar referenciar o Objeto,
poderia criar uma instância sem referência.
with TBitBtn.Create(Self) do
begin
Parent := Self;
Kind := bkClose;
Caption := ‘&Sair’;
Left := Self.ClientWidth - Width - 8;
Top := Self.ClientHeight - Height - 8;
end;
Para destruir um objeto, use o método Free. Para
Forms, é recomendado usar o Release, para que todos
os eventos sejam chamados.
O parâmetro do método Create é usado apenas em
Componentes, para identificar o componente dono. Ao
criar Forms, poderíamos usar o Objeto Application.
FrmSobre := TFrmSobre.Create(Application);
FrmSobre.ShowModal;
FrmSobre.Release;
Para criar objetos não componentes, você não precisa
de nenhum parâmetro no método Create.
var
Lst: TStringList;
begin
Lst := TStringList.Create;
Lst.Add(‘Alô, Teresinha!’);
Lst.Add(‘Uhh uhh…’);
Lst.SaveToFile(‘Teresinha.txt’);
Lst.Free;
end;
22.0 RTTI
Run Time Type Information é a informação de tipo dos
objetos em tempo de execução. O operador is é usado
para fazer comparações e o operador as é usado para
fazer um TypeCast seguro com objetos.
for I := 0 to ComponentCount - 1 do
if Components[I] is TEdit then
TEdit(Components[I]).Clear;
(Sender as TEdit).Color := clYellow;
603 - Criando uma base de dados
MS Access pelo Delphi
Resumo:
Aprenda como criar uma base de dados MS Access sem
o MS Access. Cria a base, as tabelas, índices, enfim,
tudo utilizando puro código delphi.
INTRODUÇÃO
Quando se cria um sistema para ambientes desktop
sempre surge a dúvida de qual base de dados usar.
Geralmente são usados bancos DBase, Paradox ou MS
Access. Destes, a base mais robusta e confiável é, sem
dúvida, MS Access. Mas existe um grande problema
para se criar a base de dados MS Access, pois faz-se
necessário o uso do ambiente MS Access.
Algumas pessoas não têm este aplicativo instalado em
sua máquina e então torna-se inviável o uso desta base
de dados, impedindo, desta forma, um crescimento
tecnológico do programador que fica preso a
ferramentas obsoletas.
Neste tutorial você irá aprender como criar uma base de
dados MS Access a partir do nada, usando puro código
Delphi e a Tecnologia ADO Extensions que é distribuída
pela Microsoft.
ADOX, faz parte dos componentes ADO, quer dizer, é
uma extensão do ADO. O ADOX fornece ferramentas de
acesso a estrutura, segurança, definições de tabelas e
muitos outros.
Como dito anteriormente, ADOX é uma library
distribuída pela Microsoft, o arquivo chama-se
“Msadox.dll”, sua definição é “Microsoft ADO Ext. 2.x for
DDL and Security” e é este arquivo que iremos importar
para nossa IDE no Delphi.
INSTALANDO
Para usar este objetos no Delphi basta seguir os
seguintes passos:
1- Selecione PROJECT > IMPORT TYPE LIBRARY
2- Procure pela descrição: “Microsoft ADO Ext. 2.x for
DDL and Security (Version 2.x)”
2- Em CLASS NAMES, altere o nome dos objetos
acrescentando ADOX após a letra T, exemplo: TTable
mude para TADOXTable, TColumm mude para
TADOXColumn. Repita este procedimento para todos
objetos nesta lista.
3- Em PALETTE PAGE selecione ou digite um novo
nome para a paleta onde os componentes ficarão,
exemplo: ADOX.
4- Pressione INSTALL, logo depois pressione Ok
confirmando o início da instalação.
5- Pressione YES confirmando que você quer instalar os
componentes.
6- Pressione Ok na tela que indica os objetos instalados.
7- Selecione FILE > CLOSE ALL e pressione YES para
salvar este package criado.
O motivo da troca do nome dos objetos é muito óbvio,
estes nomes de classe como Ttable já existem, então
iria gerar conflitos na compilação, por isso bastou trocar
o nome da classe.
Pronto, os objetos estão instalados, agora sempre que
você utilizar estes objetos será inserido na clausula
USES a Unit ADOX_TLB pois este é o nome da unit
criada a partir da importação da DLL.
Agora, mãos à obra.
DEFININDO A BASE DE DADOS E
OBJETOS A SEREM USADOS
Vamos criar uma base onde serão armazenados
informaçõe sobre animais de estimação (para sair um
pouco da rotina de CLIENTES/PRODUTOS/PEDIDOS).
Para esta base serão criadas as seguintes tabelas:
> PROPRIETARIO
> PRO_ID
> PRO_NOME
>ANIMAL
> ANI_ID
> ANI_PROPRIETARIO
> ANI_NOME
> ANI_NASCIMENTO
Onde um proprietario pode ter mais de um animal
formando assim um relacionamento UM PARA MUITOS.
No Delphi, crie uma nova aplicação. Será criado um
novo Form, a este insira os seguintes componentes:
> 3 TButtons
Para lançar os procedimentos de criação da base de
dados e das tabelas.
Altere as seguintes propriedades para cada TButtons
respectivamente:
Caption: Criar base
Name: btnBase
Caption: Criar tabelas
Name: btnTabelas
Caption: Navegar
Name: btnNavegar
> 1 TEdit
Para armazenar o path da base de dados a ser criada.
Altere as seguintes propriedades:
Name: edtPath
Text: (deixe em branco)
> 1 TSaveDialog
Para navegar no disco e informar o path da base de
dados.
Altere as seguintes propriedades:
Filter: Base MS Access|*.mdb
Title: Salvar como…
DefaultExt: .mdb
> 1 TADOConnection
Para fazer a conexão com a base criada.
Altere as seguintes propriedades:
Login prompt: False
> 1 TADOCommand
Para fazer a ligação e criação das tabelas.
Altere as seguintes propriedades:
Connection: Selecione o ADOConnection1
> 1 TADOXCatalog
Para criar a base de dados.
CRIANDO A BASE DE DADOS
Agora vamos ao código. Clique duas vezes no objeto
btnNavegar e digite:
procedure TForm1.btnNavegarClick(Sender:
TObject);
begin
if SaveDialog1.Execute then
edtPath.Text := SaveDialog1.FileName;
end;
Com isso informamos o nome que a base terá.
Clique duas vezes no objeto btnBase e digite o seguinte
procedimento:
procedure TForm1.btnBaseClick(Sender:
TObject);
var
Base: String;
begin
if edtPath.Text = ” then
begin
ShowMessage(‘Nome da base de dados não
informada.’);
exit;
end;
Base :=
‘Provider=Microsoft.Jet.OLEDB.4.0’+
‘;Data Source=’ + edtPath.Text +
‘;Jet OLEDB:Engine Type=4’;
ADOXCatalog1.Create1(Base);
end;
Primeiro verificamos se há algum texto no objeto TEdit,
em seguida atribuímos a string de conexão à variável
BASE informando vários parâmetros, mas atente para a
seguinte linha: “…Engine Type=4…”, isto quer dizer que
iremos criar uma base Access 97, para Access 2000
informe 5.
Em seguida é efetivamente criado a base de dados
através do método Create1 do objeto ADOXCatalog,
passando para este a string da BASE. Observe que o
método é Create1 e não simplesmente Create, pois o
método Create já existe e é da classe.
Pronto, criamos uma base de dados vazia, não existe
nada nela, mas já é um arquivo comum ao MS Access e
pode ser aberto normalmente.
CRIANDO TABELAS
dados e estruturas de dados devem ser dados devem ser centralizados, mantidos e
facilmente modificados por usuários finais protegidos
por
Alexandre de Andrade Gonçalves Analista/Programador
Minas Export Ltda
www.minasexport.com.br
638 - Protegendo o seu programa e
o seu bolso
Caso você seja um desenvolvedor contratado por
alguma empresa criando sistemas específicos para cada
cliente talvez isto nunca seja uma preocupação séria
pois há poucas possibilidades do sistema interessar
outra pessoa física ou jurídica com características
operacionais diferentes (não estou me referindo a
código-fonte aqui mas ao produto acabado).
Mas caso você esteja no mercado de softwares para o
público em geral, bem-vindo ao grande clube dos
programas pirateados. Este artigo visa introduzir alguns
conceitos de proteção de software para programadores
em geral mas antes de começarmos há uma coisa muito
importante sobre a qual gostaria de dizer: Muitas
grandes empresas liberam softwares com baixa
proteção contra pirataria exatamente visando uma
divulgação indireta do produto (ocorre muito com
componentes para Delphi, a maioria possui uma chave
publicamente divulgada). É uma tática que dá certo em
países aonde há uma certa lei e consciência por parte
dos usuários com software mas isto acredito não se
aplica ao Brasil.Um conselho: não faça isso ! Ninguém
vai comprar aqui o seu produto e a quantidade que
comprar não cobrirá os custo do desenvolvimento.
Você poderá distribuir o seu software como produto de
prateleira ou como um shareware pela Internet. A
grande vantagem do shareware é a divulgação boca à
boca (ou seria clique à clique ?) que ele oferece mas o
ideal é as duas abordagens ao mesmo tempo. Isto
possibilita que o usuário que ficou hesitante em adquirir
o produto na loja possa baixar e testá-lo. Obviamente
nunca esqueça de divulgar o seu site na embalagem.
Para vender software, um bem intangível materialmente,
é preciso um bom sistema de proteção pois o seu
programa poderá virar um freeware em poucos
segundo. É só encontrar um hacker que goste dele.
Interessante é que dificilmente um hacker irá quebrar a
proteção de um produto do qual não goste ou não use,
portanto quando encontrar cracks para o seu programa
em vários sites da web sinta-se elogiado ! Depois pode
ficar triste por não ter recebido um tostão com o seu
trabalho.
Algumas técnicas de proteção (os
prós e contras)
Para avaliação do software:
Nag-Screen: O programa sempre exibe uma tela
avisando que é uma cópia de execução restrita (ou algo
semelhante) e solicita o registro do mesmo por um
determinando período.
Prós: O Usuário sempre é lembrado com uma tela de
aviso que está com uma cópia restrita ou não totalmente
funcional. Alguns nag-screens apenas roubam um
pouco do tempo de uso do software mas não chegam a
atrapalhar o uso efetivo, o que é ótimo para o usuário: a
lógica da comida grátis que vicia.
Contras: Se a limitação for apenas o nag-screen todo
mundo se acostuma com ela e depois de um certo
tempo até se esquece que ela existe. Não é eficiente.
Período: Um programa funciona dentro de um certo
período de avaliação.
Prós: O usuário usará todo o software com todos os
recursos e poderá testar tudo.
Contras: É comum o usuário esquecer que está com
uma cópia de avaliação. Alguns softwares, com uma
péssima proteção, podem ser contornados
simplesmente voltando o calendário do sistema.
Recursos Chaves Desabilitados: O programa possui
alguns recursos que não funcionam como opções para
salvar, exportar etc.
Prós: O Usuário tem mais liberdade que todos os
métodos acima e sempre que tentar fazer o salvamento
de dados lembrará que está com um software não
totalmente funcional forçando uma compra.
Contras: É uma das formas mais fáceis de um
programa receber um crack para liberar o recurso
protegido.
Para licenciamento do software:
Número Serial: O Programa possui um número único
serial que o habilita completamente.
Prós: O usuário somente digita o serial e pronto, o
programa está liberado. Ideal para softwares de
prateleira aonde o usuário já adquiriu o produto. O
sistema preferido para a divulgação indireta.
Contras: Centenas de outros usuários somente digitam
o mesmo serial e pronto: centenas de programas
registrados. Use esta forma caso não deseje receber
pelo seu programa ou queira uma divulgação indireta do
mesmo e esperar pela consciência do usuário, isso não
funciona no Brasil. Centenas ou milhares de usuário
podem usar o mesmo serial. Esta caindo em desuso
rapidamente pois há centenas de sites com index
sofisticados de seriais para qualquer programa o que
torna o sistema quase completamente inútil hoje em dia.
HardLocks: Um pequeno dispositivo é colocado na
porta serial, paralela ou USB com uma identificação
única para liberar o funcionamento do sistema.
Prós: Um dos sistemas mais difíceis de serem
quebrados e definitivamente o mais seguro. Garante a
taxa de uma licença por máquina o que é o ideal. Para
sistemas caros (algo acima de $1000,00) considere
seriamente o uso de HardLocks.
Contras: Custo do HardLock por cópia licenciada e
alguns problemas (raros) com periféricos usando aquela
mesma porta, mas nada tão sério assim para prejudicar
o usuário. As portas seriais e paralelas estão caindo em
desuso com o USB e já existem HardLocks para elas
também. Os Hardlocks pode apresentar defeitos
dependendo do tipo.
Você deve adquirir um kit de gravação e um Hardlock
para cada cópia de distribuição. Não é muito caro mas o
seu software deve compensar isto obviamente.
Disquete de Habilitação: Um disquete é fornecido junto
com o programa para a sua habilitação ou desabilitação.
Prós: É o hardlock dos pobres sem o mesmo nível de
proteção.
Contras: Não faça proteção via disquetes de
habilitação/desabilitação como o Dr. Case e outros. É
perda de tempo ! Há vários utilitários que fazem a cópia
perfeita do disquete sendo possível habilitá-lo em
qualquer máquina. E ainda pode-se ter o problema de
superfície no disco e um belo dia quando o usuário
precisar instalar o software em outra máquina ele terá a
surpresa do disco já mofado ou perdido. Tenha certeza
que isto sempre acontece no final de semana quando
ele liga para o seu escritório na segunda descarregando
o seu vocabulário.
Identidade Única: Uma das melhores e mais eficientes
tipos de proteções é de identidade do equipamentos
recentemente implementado pela própria Microsoft. Isto
consiste em recolher dados únicos sobre o seu
computador como serial do HD, informação da BIOS
(não aconselhável), Versão do OS, Nome do
computador etc. Com base nestas informações você
poderá gerar uma fechadura de identificação. Essa
fechadura precisará de uma chave fornecida por você
para habilitar o seu software unicamente para aquela
máquina.
Prós: Difícil de ser quebrado quando bem implementado
e permite alta adaptabilidade contra cracks criado contra
o sistema como patchs invisíveis que permitem a
modificação do sistema. Permite a taxa de apenas uma
licença por computador.
Contras: Caso o usuário formate a maquina, modifique
periféricos chaves o sistema pode desabilitar a cópia
automaticamente. Isto cria problemas com a solicitação
de uma nova licença para instalação. O usuário pode
simplesmente ligar alegando este fato e de boa fé você
terá que fornecer uma nova liberação.
Habilitação Pela Internet: Ao adquirir um produto o
usuário recebe uma senha que permite a geração de um
número para habilitação e instalação em uma máquina.
Prós: Após habilitar, o número é automaticamente
invalidado para outros usuário o que evita o problema de
divulgação do mesmo pela rede.
Contras: O seu site deve estar em um provedor 100%
confiável ou esteja preparado para aquele cliente que
comprou o produto no sábado a tarde e o seu site ficou
fora do ar no domingo sem ele poder autorizar o
software para o uso.
Conclusão
Não há método melhor ou pior na minha opinião para
proteger um programa mas, mais trabalhoso ou menos
trabalhoso para um hacker quebrar. O Ideal é que que
você use duas ou mais técnicas para proteger o
programa.
Há um princípio básico que ao se usar dois sistemas
simples de proteção independentes cria-se um sistema
forte de proteção. Por exemplo, caso use o sistema de
data é fácil monitorar aonde se esta gravando esta
informação (quando o programa foi instalado) e adiar o
tempo limite de uso. Nag-Screens podem ser rastreadas
e um hacker com bons conhecimentos de assembler
pode editar diretamente o seu código binário fazendo
jumps nas avaliações de restrições. Agora combinando
duas ou três técnicas as coisas complicam para ele e
talvez o trabalho não valha a pena (coisa que ele
realmente não é acostumado).
Mas antes de começar a desenvolver o sistema de
proteção para o seu programa, siga algumas dicas que
aprendemos depois de muito prejuízo com pirataria.
1- Nunca coloque literalmente as mensagens referentes
a registro, nag-screens, avisos de limitação e etcs, em
um formato legível para um ser humano. Faça uma
encriptação destas mensagens. Uma técnica bem
simples dos hackers consiste em procurar no código
binário por uma determinada ocorrência tipo ” Cópia
Trial” e perto tem um “IF” aonde se pode bloquear e lá
se foi a sua proteção. Portanto, faça uma função de
codificação e decodificação e grave todas as
mensagens codificadas no seu programa (no código-
fonte) sendo que as mesmas somente serão exibidas
quando você chamar a função de decodificação.
2- Faça uma estampa no software. Ou seja, todos os
programas possuem uma informação referente ao seu
tamanho físico, data e hora de criação e CRC. Caso o
seu programa tenha sido alterado após aquela data,
através de uma função, o programa poderá verificar em
sua estampa interna se ele foi modificado. Aqui pode
ocorrer alguns problemas com programas anti-virus que
usam a mesma técnica para monitorar alteração de
executáveis aplicando uma “vacina” neles mas já é da
responsabilidade do usuário.
3- Grave dados no registry sempre encriptados e, se
eles forem sobre as informações de registro nunca
coloque na mesma árvore das outras definições do seu
software. Isto dificulta e muito as coisa. Mas se o hacker
possui um programa de monitoramento do registry ele
poderá facilmente contornar isto mas não antes sem um
bom trabalho de adivinhação. E, nunca use chaves com
nomes óbvios tipo “Serial”, “SenhaPrograma”,
“DataLimite” e etc. Dê sempre preferência a gravar
dados de configuração e autorização no registry do que
em arquivos INI (lembra-se deles ?). O registry é mais
difícil de ser manipulado por um leigo e é possível
colocar chaves observando a mudança de outras
chaves o que torna as coisas mais complexas.
4- Se possível, implemente um sistema periódico de
verificação da licença via site na web.
Coloque este alerta em seu termo de uso do seu
software e o faça de tal forma que seja invisível, indolor
(não fique interrompendo o usuário) e que desabilite o
software imediatamente ao verificar uma cópia com o
número de série irregular ou divulgado. É importante
aqui implementar nos CGI do site um alerta via e-mail
quando ocorrer várias tentativas de liberação de um
mesmo serial. Assim você descobre rapidamente quem
vazou um serial para o público.
5- Tenha uma proteção não divulgada. Por exemplo,
após o software executar 300 vezes uma mensagem
surge do nada indicando o download de uma cópia mais
atualizada. Nesta nova cópia você já deve ter
contornado todos os problemas com cracks que
apareceram no período.
6- Faça Check Point em pontos não óbvios do seu
software e em vários lugares. Use uma periodicidade
completamente aleatória para fazer isto. Por exemplo,
quando o usuário abrir uma determinada tela não muito
utilizada, ocorre uma verificação em background sobre a
validade da licença esta verificação pode e deve ser
aleatória. Após validar e algo estiver errado, nunca exiba
no mesmo momento que a licença é irregular pois se
torna uma referência para o Hacker aonde ele deve
procurar no código binário para quebrar o seu programa.
Lembre-se que tudo serve como marcação no código
binário: um caption de um form, o conteúdo string de um
controle etc.
7- Use constantes. Abuse delas em vez de escrever
diretamente nos dialogs para comunicação com usuário.
Faça uma Unit separada aonde somente é armazenado
estas constantes. Isso confunde quem olha o código
binário do executável pois fisicamente no executável
elas não estarão próximas.
Todas estas informações foram adquiridas com a nossa
experiência e, principalmente, com dicas de dois
conhecidos especialistas em quebras de programas e
criação de cracks. Na primeira divulgação de um dos
nossos softwares um deles me retornou uma cópia
crackeada em questão de horas (segundo ele, estava
sem tempo por isso demorou tanto), e ficamos
envergonhados para dizer a verdade. Depois ao
implementarmos a codificação de string e outras
técnicas, ele levou uma semana mas não conseguiu
liberar todos os recursos. Ao ativarmos os sistemas
randômicos de verificação em background e validação
pelo site ainda não tivemos uma quebra. Claro que ela
irá ocorrer, mas enquanto isto estamos recebendo pelo
nosso trabalho.
Acho que seguindo estas dicas você terá uma boa
chance de receber pelo seu trabalho na quantidade
justa. Lembre-se que há uma legião de pessoas ai fora
tentando quebrar a proteção pelo simples prazer de
dizer que foram eles.
Portanto a questão não é fazer um sistema 100%
seguro (o que é quase impossível) mas um que seja
110% trabalhoso para eles. Tenha em mente também
que eles são em maior número e problema não é se vão
quebrar a segurança mas quando e o que você vai fazer
em seguida.
Não poderíamos terminar este artigo sem falar sobre
alguns componentes para proteção.
Uma coisa que percebi é que certos componentes de
proteção são tão complicados que você as vezes tem
que passar uma semana implementando ele no seu
sistema. Mas aqui estão alguns que são ótimos pela
simplicidade e fácil implementação.:
OnGuard (TurboPower) - Não é propaganda pessoal !
Os componentes da TurboPower tem uma grande
qualidade e o OnGuard faz tudo o que se precisa de
proteção. Validação e criação de serial, limitação por
data, estampa no executável, dias de execução e muito
mais. A grande vantagem é que há exemplos para tudo
que podem ser fácil e rapidamente adaptados.
Lock&Key - Gosto do Lock&Key pela sua simplicidade
de uso. Ele gera uma “fechadura” com base nos dados
do HD do usuário e com este número-fechadura você
cria um número único para liberar o software. Trabalha
com níveis o que é ideal para proteção progressiva. Não
estamos usando mais este, apesar de sua boa
qualidade.
SharewareIt - Crie sistemas de shareware de forma
bem simples. A vantagem é que é gratuito.
unit Arquivos;
interface
uses
Windows, Dialogs, Messages, SysUtils,
Classes, Controls, StdCtrls,FileCtrl,
Graphics, shellapi, Printers;
implementation
Procedure ZapFiles(vMasc:String);
{Apaga arquivos usando mascaras tipo:
*.zip, *.* }
Var Dir : TsearchRec;
Erro: Integer;
Begin
Erro := FindFirst(vMasc,faArchive,Dir);
While Erro = 0 do Begin
DeleteFile(
ExtractFilePAth(vMasc)+Dir.Name );
Erro := FindNext(Dir);
End;
FindClose(Dir);
End;
function WinExecAndWait32(FileName:String;
Visibility : integer):integer;
{ Tenta executar o aplicativo finalizando-
o corretamente apos o uso. Retorna -1 em
caso de falha}
var
zAppName:array[0..512] of char;
zCurDir:array[0..255] of char;
WorkDir:String;
StartupInfo:TStartupInfo;
ProcessInfo:TProcessInformation;
begin
StrPCopy(zAppName,FileName);
GetDir(0,WorkDir);
StrPCopy(zCurDir,WorkDir);
FillChar(StartupInfo,Sizeof(StartupInfo),#
0);
StartupInfo.cb := Sizeof(StartupInfo);
StartupInfo.dwFlags :=
STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not
CreateProcess(nil,zAppName,nil,nil,false,C
REATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS,nil,
nil,StartupInfo,ProcessInfo) then
begin
Result := -1;
end
else
begin
WaitforSingleObject(ProcessInfo.hProcess,I
NFINITE);
GetExitCodeProcess(ProcessInfo.hProcess,Re
sult);
end;
end;
function NumLinhasArq(Arqtexto:String):
integer;
// Retorna o número de linhas que um
arquivo possui
Var
f: Textfile;
linha, cont:integer;
Begin
linha := 0;
cont := 0;
AssignFile(f,Arqtexto);
Reset(f);
While not eof(f) Do
begin
ReadLn(f);
Cont := Cont + 1;
end;
Closefile(f);
result := cont;
end;
function FileCopy(source,dest: String):
Boolean;
{copia um arquivo de um lugar para outro.
Retornando falso em caso de erro}
var
fSrc,fDst,len: Integer;
size: Longint;
buffer: packed array [0..2047] of Byte;
begin
if source <> dest then
begin
fSrc := FileOpen(source,fmOpenRead);
if fSrc >= 0 then
begin
size := FileSeek(fSrc,0,2);
FileSeek(fSrc,0,0);
fDst := FileCreate(dest);
if fDst >= 0 then
begin
while size > 0 do
begin
len :=
FileRead(fSrc,buffer,sizeof(buffer));
FileWrite(fDst,buffer,len);
size := size - len;
end;
FileSetDate(fDst,FileGetDate(fSrc));
FileClose(fDst);
FileSetAttr(dest,FileGetAttr(source));
Result := True;
end
else
begin
Result := False;
end;
FileClose(fSrc);
end;
end;
end;
function PrintImage(Origem:
String):Boolean;
// imprime um bitmap selecionado
retornando falso em caso negativo
// requer as units Graphics e printers
declaradas na clausula Uses
var
Imagem: TBitmap;
begin
if fileExists(Origem) then
begin
Imagem := TBitmap.Create;
Imagem.LoadFromFile(Origem);
with Printer do
begin
BeginDoc;
Canvas.Draw((PageWidth - Imagem.Width)
div 2,(PageHeight - Imagem.Height) div
2,Imagem);
EndDoc;
end;
Imagem.Free;
Result := True;
end
else
begin
Result := False;
end;
end;
end.
516 - Biblioteca para operações
com DiskDrives
{
Objeto…: Biblioteca para operações com
disk-drives.
Categoria: Open-Source
Autor….: Daniel Pereira Guimarães
E-mail…: tecnobyte@ulbrajp.com.br
Home-Page: www.ulbrajp.com.br/~tecnobyte
Revisão..: 21 de Fevereiro de 2001
}
unit tbDskDrv;
interface
type
TtbDriveType = (dtUnknown, dtNotExist,
dtRemovable, dtFixed,
dtRemote, dtCdRom, dtRamDisk, dtError);
TtbVolInfo = record
Name: string;
Serial: Cardinal;
IsCompressed: boolean;
MaxCompLen: Cardinal;
FileSysName: string;
end;
implementation
case Windows.GetDriveType(PChar(Path))
of
0: Result := dtUnknown;
1: Result := dtNotExist;
DRIVE_REMOVABLE: Result := dtRemovable;
DRIVE_FIXED: Result := dtFixed;
DRIVE_REMOTE: Result := dtRemote;
DRIVE_CDROM: Result := dtCdRom;
DRIVE_RAMDISK: Result := dtRamDisk;
else
Result := dtError;
end;
end;
SetLength(Result, 255);
PrevErrorMode :=
SetErrorMode(SEM_FAILCRITICALERRORS);
try
if GetVolumeInformation( PChar(Path),
PChar(Result), 255,
nil, MaxCompLen, FileSysFlag, nil, 0)
then
Result := string(PChar(Result))
else
Result := ”;
finally
SetErrorMode(PrevErrorMode);
end;
end;
PrevErrorMode :=
SetErrorMode(SEM_FAILCRITICALERRORS);
try
if not GetVolumeInformation(PChar(Path),
nil, 0,
@Result, MaxCompLen, FileSysFlag, nil,
0) then
Result := 0;
finally
SetErrorMode(PrevErrorMode);
end;
end;
SetLength(Result.Name, cVolNameLen);
SetLength(Result.FileSysName,
cSysNameLen);
PrevErrorMode :=
SetErrorMode(SEM_FAILCRITICALERRORS);
try
if GetVolumeInformation(Path,
PChar(Result.Name), cVolNameLen,
@Result.Serial, Result.MaxCompLen,
Flags,
PChar(Result.FileSysName), cSysNameLen)
then
begin
Result.Name :=
string(PChar(Result.Name));
Result.FileSysName :=
string(PChar(Result.FileSysName));
Result.IsCompressed := (Flags and
FS_VOL_IS_COMPRESSED) > 0;
end else begin
Result.Name := ”;
Result.Serial := 0;
Result.IsCompressed := false;
Result.MaxCompLen := 0;
Result.FileSysName := ”;
end;
finally
SetErrorMode(PrevErrorMode);
end;
end;
end.
Biblioteca para operações com
Hardware
{*****************************************
**************}
{ }
{ Delphi Runtime Library }
{ Windows Messages and Types }
{ }
{ Copyright (c) 1991,96 Walter Alves
Chagas Junior }
{ }
{*****************************************
**************}
unit Hardware;
interface
uses
Windows, Dialogs, Messages, SysUtils,
Classes, Controls, StdCtrls, Graphics,
Printers, shellapi, MMSystem;
function TestaPlaca(Value:integer):
Boolean;
function DiscoNoDrive(const drive : char):
boolean;
function
NumeroSerie(Unidade:PChar):String;
function DetectaDrv(const drive : char):
boolean;
function NumeroDeCores : Integer;
function Percentdisk(unidade: byte):
Integer;
function IsPrinter : Boolean;
function CorrentPrinter :String;
implementation
Function TestaPlaca(Value:integer):
Boolean;
{Testa se existe uma placa de som no seu
computador}
begin
if WaveOutGetNumDevs > 0 then
begin
result := True
end
else
begin
Result := False;
end;
end;
function
NumeroSerie(Unidade:PChar):String;
{Retorna o Número serial da unidade
especificada}
var
VolName,SysName : AnsiString;
SerialNo,MaxCLength,FileFlags : DWord;
begin
try
SetLength(VolName,255);
SetLength(SysName,255);
GetVolumeInformation(Unidade,PChar(VolName
),255,@SerialNo,
MaxCLength,FileFlags,PChar(SysName),255);
result := IntToHex(SerialNo,8);
except
result := ‘ ‘;
end;
end;
end.
517 - Biblioteca para Operações
com Mouse
{
Objeto…: Biblioteca para operações com
mouse.
Categoria: Open-Source
Autor….: Daniel Pereira Guimarães
E-mail…: tecnobyte@ulbrajp.com.br
Home-Page: www.ulbrajp.com.br/~tecnobyte
Revisão..: 21 de Fevereiro de 2001
}
unit tbMouse;
interface
implementation
{ Inicia o click }
mouse_event(FlagMouseDown, 0, 0, 0, 0);
Sleep(Duration);
{ Conclui o click }
mouse_event(FlagMouseUp, 0, 0, 0, 0);
end;
function MouseSlideToControl(const
Control: TControl; Jump, JumpTime: Word):
boolean;
var
ToPoint, Pt: TPoint;
begin
if Jump = 0 then
Jump := 1;
SetCursor(Screen.Cursors[Control.Cursor]);
with Control do begin
ToPoint.x := Width div 2;
ToPoint.y := Height div 2;
ToPoint := ClientToScreen(ToPoint);
end;
if GetCursorPos(Pt) then
while ExecJump do Sleep(JumpTime);
end.
519 - Biblioteca para Operações
com o Sistema
{
Objeto…: Biblioteca de rotinas de
sistema.
Categoria: Open-Source
Autor….: Daniel Pereira Guimarães
E-mail…: tecnobyte@ulbrajp.com.br
Home-Page: www.ulbrajp.com.br/~tecnobyte
Revisão..: 21 de Fevereiro de 2001
}
unit tbSys;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
implementation
{ Sys }
function SysComputerName: string;
var
I: DWord;
begin
I := MAX_COMPUTERNAME_LENGTH + 1;
SetLength(Result, I);
Windows.GetComputerName(PChar(Result),
I);
Result := string(PChar(Result));
end;
Windows.GetWindowsDirectory(PChar(Result),
MAX_PATH);
Result := string(PChar(Result));
end;
function SysSetComputerName(const S:
string): boolean;
begin
Result :=
Windows.SetComputerName(PChar(S));
end;
unit tbStr;
interface
uses SysUtils;
implementation
end.
569 - Biblioteca com funções para
Strings
{*****************************************
**************}
{ }
{ Delphi Runtime Library }
{ Windows Messages and Types }
{ }
{ Copyright (c) 1991,96 Walter Alves
Chagas Junior }
{ }
{*****************************************
**************}
unit Strings;
interface
uses
Windows, Dialogs, Messages, SysUtils,
Classes, Controls, StdCtrls, Mask;
implementation
function
RoundNum(Valor:Extended;Decimais:Integer):
Extended;
{Quando houver,Arredonda uma possivel
terceira casa decimal em uma variável}
var
I:Integer;
Multiplicador:Integer;
begin
if Decimais > 15 then
begin
Decimais := 15;
end
else if Decimais < 0 then
begin
Decimais := 0;
end;
Multiplicador := 1;
for I:=1 to Decimais do
begin
Multiplicador := Multiplicador*10;
end;
Result :=
round(Valor*Multiplicador)/Multiplicador;
end;
function
Gerapercentual(valor:real;Percent:Real):re
al;
// Retorna a porcentagem de um valor
begin
percent := percent / 100;
try
valor := valor * Percent;
finally
result := valor;
end;
end;
// Integer
function IntToBin(Value: LongInt;Size:
Integer): String;
{Converte uma string em binário}
var
i: Integer;
begin
Result:=”;
for i:=Size downto 0 do
begin
if Value and (1 shl i)<>0 then
begin
Result:=Result+‘1’;
end
else
begin
Result:=Result+‘0’;
end;
end;
end;
function Base10(Base2:Integer):Integer;
assembler;
{Converte uma string em Base 10}
asm
cmp eax,100000000 // check upper limit
jb @1 // ok
mov eax,-1 // error flag
jmp @exit // exit with -1
@1:
push ebx // save registers
push esi
xor esi,esi // result = 0
mov ebx,10 // diveder base 10
mov ecx,8 // 8 nibbles (10^8-1)
@2:
mov edx,0 // clear remainder
div ebx // eax DIV 10, edx mod 10
add esi,edx // result = result +
remainder[I]
ror esi,4 // shift nibble
loop @2 // loop for all 8 nibbles
mov eax,esi // function result
pop esi // restore registers
pop ebx
@exit:
end;
// Strings
Function StrToReal(inString :String):
Real;
{converte um número em Float}
Var
i : Real;
k : Integer;
Begin
Val(inString,i,k);
StrToReal := i;
End;
function BuscaTroca(Text,Busca,Troca :
string) : string;
{ Substitui um caractere dentro da string}
var n : integer;
begin
for n := 1 to length(Text) do
begin
if Copy(Text,n,1) = Busca then
begin
Delete(Text,n,1);
Insert(Troca,Text,n);
end;
end;
Result := Text;
end;
function ContaCaracs(Edit:String):
integer;
{Retorna quantos caracteres tem um Edit
especificado}
begin
Result := Length(Edit);
end;
function LTrim(Texto:String):String;
{Remove os Espaços em branco à direita da
string}
var
I : Integer;
begin
I := 0;
while True do
begin
inc(I);
if I > length(Texto) then
break;
if Texto[I] <> #32 then
break;
end;
Result := Copy(Texto,I,length(Texto));
end;
function Padr(s:string;n:integer):string;
{alinha uma string à direita}
begin
Result:=Format(‘%’+IntToStr(n)+’.’+IntToSt
r(n)+‘s’,[s]);
end;
function RemoveAcentos(Str:String):
String;
{Remove caracteres acentuados de uma
string}
Const ComAcento =
‘àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ’;
SemAcento =
‘aaeouaoaeioucuAAEOUAOAEIOUCU’;
Var
x : Integer;
Begin
For x := 1 to Length(Str) do
Begin
if Pos(Str[x],ComAcento)<>0 Then
begin
Str[x] :=
SemAcento[Pos(Str[x],ComAcento)];
end;
end;
Result := Str;
end;
function Replicate( Caracter:String;
Quant:Integer ): String;
{Repete o mesmo caractere várias vezes}
var I : Integer;
begin
Result := ”;
for I := 1 to Quant do
Result := Result + Caracter;
end;
function RTrim(Texto:String):String;
{Remove os Espaços em branco à esquerda da
string}
var
I : Integer;
begin
I := length(Texto)+1;
while True do
begin
Dec(I);
if I <= 0 then
break;
if Texto[I] <> #32 then
break;
end;
Result := Copy(Texto,1,I);
end;
Function Strs(I:longint):string ;
{Converte uma variavel numérica em string}
Var
X : string[16] ;
begin
STR (I,X) ;
Strs := X ;
end ;
function
StrZero(Zeros:string;Quant:integer):String
;
{Insere Zeros à frente de uma string}
var
I,Tamanho:integer;
aux: string;
begin
aux := zeros;
Tamanho := length(ZEROS);
ZEROS:=”;
for I:=1 to quant-tamanho do
ZEROS:=ZEROS + ‘0’;
aux := zeros + aux;
StrZero := aux;
end;
end;
function Padl(s:string;n:integer):string;
// Alinhamento pela esquerda
{alinha uma string à esquerda}
begin
Result:=Format(‘%-‘+IntToStr(n)+’.’+IntToS
tr(n)+‘s’,[s]);
end;
function LineIsEmpty(Text:string):boolean;
// Testa se uma linha de texto está vazia
ou não
var
i:byte;
begin
for i:=1 to length(Text) do
begin
if Text[i]<>’ ‘ then
begin
result := False;
exit;
end;
end;
Result := True;
end;
function PadC(S:string;Len:byte):string;
// Centraliza uma string em um espaço
determinado
var
Str:String;
L:byte;
begin
str :=”;
if len < Length(s) then
begin
Result := ”;
Exit;
end;
l:=(Len-Length(S)) div 2;
while l > 0 do
begin
str:=str+’ ‘;
dec(l);
end;
for l:=1 to length(S) do
begin
str := str+s[L];
end;
Result := str;
end;
function
FullFill(Str:String;FLen:byte;symb:char):s
tring;
// Preenche o restante da string com um
caractere especificado
var
S:String;
i:byte;
begin
s:=Str;
if Length(s) >= FLen then
begin
Result := s;
Exit;
end;
for i := Length(s) to FLen do
begin
S := S + symb;
end;
Result := s;
end;
Observação
Tudo isso em um único CD!!!
Agora pense um pouco…
Quanto tempo você acha que levaria
para baixar isso tudo da Internet, ou
pior, quanto tempo levaria para você
encontrar todo esse material!!
Então, o que você está fazendo ai?
Compre já!!!!
Entre em contato pelo e-mail lloydsoft@uol.com.br ou
lloydsoft@ig.com.br e saiba como proceder para adquirir
esta poderosa arma!!
Menu Principal
Apostilas, Tutoriais, Cursos Sobre
Delphi
Um Cd especialmente preparado com Apostilas, dicas
de Delphi e ainda algumas apostilas de outros assuntos
Geral
Uma calculadora “Pauleira!”
CooCalc
Exemplo de um programa de E-Mail
EMail
Como obter a diferença entre duas Datas e Duas horas
DifData
Exemplo de como obter a distância em metros.
Distancia
Exemplo de como somar meses à uma data especificada
SomaMes
Exemplo de como obter o último dia do mês
Ultdia
Exemplo de um Calendário muito bom
Calendar
Como chamar uma calculadora
NewCal
Exemplo de como usar CGI no delphi
CgiDelphi
Como fazer dois computadores se comunicarem entre si
DDE
Como converter horas em segundos e segundos em horas
HoraSeg
Programa de manipulação de mensagens em rede
Mensagens
Um Relogio Bacana
Relógio
Exemplo de um FTP com Delphi
FTP
Exemplo de Macrosubstituição
MacroSubst
Exemplo de chat
Chat
Um bom exemplo de Calculadora
Calculadora
Um utilitário para manipular código fonte pascal
CodeApp
Exemplo de um encriptador de dados
Cryt
Exemplo de como manipular os cursores do mouse
DemoCursor
Exemplo de como criar um programinha de instalação
Install
Exemplo de como não permitir que seu demo rode fora do
Register
Delphi
Rescalc
Tabela de código de cores para resistores
Factorial
Exemplo de como trabalhar com um Fatorial.
Calendario
Um modelo de calendário
InvaDate
Exemplo básico de como tratar datas inválidas
OpArit
Exemplo de como trabalhar com operadores aritméticos
Classref
Exemplo de manipulação de classes
Componentes
Calorias Exemplo de como fazer a comunicação entre dois ListBox
ComboActive Exemplo de como deixar um Combobox aberto
EditChange automáticamente
CursorMemo Como fazer uma pesquisa em um Listbox através de um
Combinação Edit
Lista Como obter a posição do cursor em um componente
Marquee TMemo
Selecao Exemplo de como retornar o item de um Combobox
Mirror Exemplo de como inserir um item em um listbox
QuickReport Exemplo de como criar um Banner controlado
Relatorios Exemplo de como Selecionar um item de um listbox
CriaComp Exemplo de um Espelho muito “Doidão”
CombSgrid Varios exemplos para você fazer relatórios com o
QuickReport
MoveRuntime Como trabalhar com relatorios via QuickReport ou
ScrolList Tprinter
TreeView Como criar um componente em tempo de execução
Parser Como inserir um ComboBox dentro de um StringGrid
DragDrop Como mover um componente em Run-Time
DragDropDem Como colocar um ScrollBar em um componente ListBox.
DragDrop1 Exemplo de como usar o TreeView
DragDrop3 Como enviar o conteúdo de um Edit para um MEMO
DragDropTB Exemplo do método DragDrop
DemoCursor Outro exemplo do método DragDrop
FlyToolBar Outro bom exemplo de como usar o Evento Drag’n Drop
LinColMemo Outro bom exemplo de como usar o Evento Drag’n Drop
MenuEx97 Exemplo de como arrastar um botão para a Barra de
SpeedButton ferramentas
ExTrview Exemplo de como manipular os cursores do mouse
ComboOpen Exemplo de como criar uma barra de tarefas flutuante
Contagem Exemplo de como obter linha e coluna em um Memo
Eventos Exemplo de como fazer um menu igual ao do Office 97
OpClass Um bom exemplo com os SpeedButons
CommMemo Outro exemplo de como usar o TreeView
DBLookUpGrid Exemplo de como Abrir um Combobox em Run-Time
ComboLarge Exemplo de como Contar os caracteres de um TMemo
IconeNoButton Exemplo de como Trabalhar com os eventos do
ListHorizontal componente
Menuprj Exemplo de como obter o nome da classe de um
componente
Exemplo de como fazer um Memo se comunicar com
outro
Como Incorporar um DBLookUpCombobox em um
DBGrid.
Exemplo de como Expandir a lista do Combobox.
Exemplo de como inserir um icone em um TButton
Exemplo de como colocar um ScrollBar horizontal no
ListBox
Exemplo de como inserir Bitmaps no fundo do menu
Forms
LabelMovel Exemplo de como fazer um banner em um form
FormTotal Exemplo de como criar um Form em tela cheia
ParametForm Exemplo de como passar parâmetros de um form para
VarInvisible outro
FormDinamic Como manipular variaveis entre dois ou mais forms
ClipBoard Como criar formulários dinamicos
DibTest Como colar no form, uma figura da area de transferência
BitmpaForm Exemplo de como criar um Form Exótico
RestrictSize Como colocar um bitmap lado a lado no fundo de um
CircleForm form
FrameForm Exemplo de como bloquear o redimensionamento do Form
Poligon Exemplo de como criar um form circular
PopUp Exemplo de como colocar frames em um form
DifLinhas Exemplo de como desenhar um poígono em um form
FormBitmap Exemplo de como criar um menu PopUp em um form
TBitmaPlus Exemplo de como desenhar linhas no form
FormTake Como colar um Bitmap no fundo do Form pela API do
CopyClipBrd Windows
MoveForm Outro exemplo de como colocar um Bitmap no fundo do
ScreenSBit Form
RolupForm Como suspender a animação de minimizar e maximizar o
RotateCube form
Region Exemplo de como copiar o Form para a área de
SineWave transferência
DfmToTxt Como mover um form clicando em qualquer lugar nele
ClasProc Exemplo de como carregar Bitmpas no Form
Invisible Como criar um Form que role na tela semelhante à uma
persiana
Random
Work Exemplo de como criar um cubo rotatório no form
Como obter posições de figuras no form com o mouse
Mousmove
Exemplo de como desenhar ondas senoidais no Form
CriaRuntime
CenterForm Este Exemplo converte e exibe um arquivo DFM no modo
TXT
NDragDrop
Exemplo de como Manipular Classes no Delphi
FormProps
Exemplo de como fazer um form invisível
Syscomand
Exemplo de como produzir recursos animados em um
DrawForm
form
NoTarget
Exemplo de como trabalhar com uma thread.
CapButton
Exemplo de como obter a posição do mouse em um Form.
Params
Exemplo de como criar um Botão no Form, em Run-Time.
CloneIco
Exemplo de como centralizar um Form em Run-Time
Estrela
Outro Exemplo de Drag-drop
ExecutaCom
Outro Exemplo obter as propriedades de um Form
splash
Exemplo de como fazer todos os forms minimizarem
TituloForm
juntos
Exemplo de como Desenhar formas do form
Exemplo de como Ocultar e exibir um aplicativo.
Exemplo de como Colocar um botão na barra de título do
form.
Exemplo de como Passar parâmetros de um Form para o
projeto.
Exemplo de como clonar um Icone em um form
Exemplo de criar um form em formato de estrela
Como executar comandos Dos e formatar a saida deles
no Form
Exemplo de como gerar um Splash form em seu aplicativo
Exemplo de como colocar um titulo diferente no form
Arquivos
W95Files Um Bom exemplo de como copiar arquivos
CompareFile Exemplo de como comparar dois arquivos linha a linha
Win95files Mais dois exemplos de como copiar arquivos
TextFile Exemplo de como manipular um arquivo Texto
Search Exemplo de como procurar um texto em um arquivo
FileCompare Exemplo de como comparar dois arquivos
WFileList Exemplo de como exibir os arquivos em uma janela
AviCreate Exemplo de como criar um arquivo .Avi em codigo Delphi
DirList Como efetuar uma procura de arquivos em um diretorio
Wntdy202 Exemplo de Busca e deleção de arquivos
CopyFiles Um Bom exemplo de como copiar arquivos
Attribute Exemplo de um gerenciador de atributos de arquivos
IniFile Exemplo de como gerar um arquivo INI
catlst_s Como criar aquivos Help a partir de um Arquivo RTF
dcrfix Corrige arquivos DCR danificados por Bug no ImageEdit
Url2html Como inserir as URL´s dos “Favoritos” em um arquivo
Dropfile HTML
Exinifile.zip Arraste um arquivo para o form e veja seu nome sendo
MiniDir exibido
VisualPas Exemplo de como obter dados de um Arquivo .ini
EArquivos Exemplo de como criar uma lista de arquivos de uma
HtmlCoder unidade
Resmaker Exemplo de como visualizar um arquivo Texto em um
TextDemo Memo.
VolInfo Exemplo de como carregar um arquivo Texto em um
TMemo
Exemplo de como Converter um Arquivo texto em HTML.
Ferramenta para criar arquivos .RES
Exemplo de como carregar um arquivo Texto em um
TMemo
Exemplo de como Obter todas as informações de um
Drive.
Sistema
1vez Exemplo de como executar o aplicativo somente uma vez
AnimCursor Classe que usa um cursor no estilo do Windows NT
bios Exemplo de como obter o numero da Bios de seu
Empresa sistema.
Ambiente Como obter o nome do usuário registrado no windows
Ras Exemplo de como obter dados do Ambiente do
OSVersion Dos/Windows
TaskList Excelente programa de Conexão Dial-up (c/Fontes)
TipoDrv Exemplo que retorna diversas informações do sistema
WindFlag Exemplo de como criar uma lista de tarefas
WinMsg Como obter os Drives do computador em TMemo
ResWatch Como obter dados da CPU em um componente TMemo
CriaGrupo Exemplo de como enviar mensagems para o Windows
SysInfo Como obter os recursos do sistema
ChangeRes Como criar grupo de programa e ícones
CpuIdent Exemplo de como obter os dados do sistema
CriaAtalho Exemplo de como trocar automaticamente a resoluçào do
DiskBeench vídeo
MapMemory Exemplo de como obter dados da CPU
PortTest Exemplo de como criar um atalho no Windows
SendMessage Exemplo de como Testar a velocidade de um drive
Serial D1 Exemplo de como A memoria é mapeada
Conecta Exemplo de como testar uma porta serial em seu
DefaultPrn computador
GetDriveSpace Exemplo de como enviar mensagens para o Windows
Modemsyp Como obter o numero serial do HD no Delphi 1
Memory Ccomo acessar sua conexão Dial-up através do Delphi
Version Exemplo de como alterar a impressora padrão do
RasApi Windows.
TestDial Como obter o espaço em disco formatado com a FAT32
Icmp Programa que acessa o seu modem
Testport Exemplo de como exibir dados da memória no Form
cursor.zip Exemplo de como exibir informações internas de um
dlg_demo arquivo
bk1sys Exemplo de como usar os recursos do Dial-up com o
Reg Delphi
FDrive Como usar os recursos da Discagem automática com o
MonitorOnOff Delphi
BandejaCD Exemplo de como “Pingar” uma estação
SSEnable Exemplo de como se comunicar com uma porta serial
TempoDecor Exemplo de como trocar o cursor do mouse em uma
aplicação
Screen
Exemplo de como usar as mensagens de aviso no Delphi.
ShiftState
KeyChange Exemplo de como obter mensagens em um TMemo.
Exemplo de como obter chaves no registro do Windows.
TrayApp
Este exemplo diz que formata até a unidade C Voce
TimeOut
arrisca?
MenuChoice
Exemplo de como desligar o Monitor via Delphi
OnShow
Exemplo de como abrir e fechar a bandeja do CD-Rom
TApiDialup
Exemplo de como habilitar o Scren Saver do Windows
IconHide
Exemplo de como obter o tempo que o programa esteve
MouseConfig
aberto
TaskApplic
Exemplo de como trocar a fonte e o cursor em um
TreeScan
aplicativo
wSC Exemplo de como obter o estado de certas teclas
WordTest
Exemplo de como ativar e desativar teclas via Delphi
Exemplo de como Minimizar a aplicação na barra de
tarefas
Exemplo de como fechar um aplicativo depois de um
certo tempo
Exemplo de como Inserir um Item no Menu do sistema
Exemplo de como Ocultar e exibir um aplicativo.
Exemplo de como usar a discagem automática via Delphi.
Exemplo de como ocultar o aplicativo
Exemplo de como configurar os botões do Mouse via
Delphi
Como minimizar seu aplicativo à um Icone na barra de
tarefas
Como obter a estrutura de um diretorio atraves de um
Treeview
Bibliotecas com recursos para voce acessar as portas
seriais
Como fazer seu aplicativo se comunicar com o Wodr
Tabelas
DBpTXT Como converter uma tabela paradox em Txt e vice versa
TabHtml Gera um codigo HTML para exibir uma tabela no browser
Inmemdel Exemplo de como Copiar dados de uma tabela para outra
Filter Exemplo de como trabalhar com filtros em tabelas
Filtro Outro exemplo de como trabalhar com filtros em tabelas
findnear Exemplo de como trabalhar com o FindNearest em
TableGenerate tabelas
TableScanner Gera um código para criar uma tabelas
GetStructure Outro gerador de código para criar tabelas
DbfToSql Extrai a estrutura de uma tabelas Paradox
NdxBuild Importa dados de um DBF para um Interbase SQL
KeyViolation Exemplo de construtor de índices NDX
Convet Exemplo de como tratar a Exceção KeyViolation
Pedaço Conterte Tabelas Dbase em Paradox
Relaction Como filtrar uma tabela por partes de um dado
DBGrid Exemplo de como relacionar tabelas em Delphi
CorGrid Como retornar a celula ativa de um DBGrid
BotNavigator Como mudar a cor de uma célula de um DBGrid
Reindex Como Navegar por uma tabela com a filosofia do
DBDragDrop DBNavigator
LiveQuery Pequeno programinha para reindexar tabelas (C/Interface
MSelDBGrid e tudo)
CopySort Exemplo do método DragDrop aplicado em uma tabela
CreateData Exemplo de Uso de Filtro em um Query
IReferencial Exemplo de multiseleção em um DBGrid
JPEGPdx Exemplo de como copiar tabelas cheias
Addpswd Exemplo de como criar uma tabela
Delcfg32 Como manipular a integridade referencial de uma tabela
TestGIF Exemplo de como guardar imagens JPG em uma tabela
ThExeption paradox
DBDemo Exemplo de como Manipular Senhas em tabelas
TUtil Programa que permite voce manipular dados no BDE via
Delphi
CriqArquivo
SQLDemo Exemplo de como Manipular imagens Gif
Exemplo de como tratar exeções
DataExplorer
Bom Exemplo de como trabalhar com tabelas, no geral.
PkParadox
Recno Como usar a Tutil32.dll para consertar Tabelas paradox.
Exemplo de como criar uma Tabela em tempo de
Sharedm
execução.
lookup
Exemplo para iniciantes de como usar uma Query/Sql c/o
Pwh
Delphi.
CampoCalc
Como usar um Treeview para exibir os dados de uma
ThrQuery
tabela.
Calc
Exemplo de como dar um pack em uma tabela paradox.
Cop_sor
Exemplo de como obter o registro corrente da tabela.
DBFQuery
Como Fazer uma edição de dados a partir de um DBGrid.
DBGridcombo
Exemplo de como trabalhar com uma thread.
Gensql
Programa que rastreia senhas em tabelas Paradox.
RefInt Exemplo de como trabalhar com campos calculados
Exemplo de como trabalhar com Query’s
Exemplo de como manipular campos calculados
Exemplo de como copiar dados de uma tabela para outra
Exemplo de passar parametros para uma Query
Exemplo de como colocar um ComboBox em um DBGrid
Programa que gera Instruções SQL
Como trabalhar c/a integridade referencial de uma tabela
Variáveis
Maior Exemplo de como comparar dois números
Round Como manipular variáveis de ponto flutuante
AsciiConv Exemplo que retorna o valor Ascii de um caractere
Translate Exemplo de como converter um Numero em seu extenso
Uint Programa que faz diversas operações com numeros
FmtTest Exemplo de como formatar dados
Multimídia
Exemplo de como usar o componente Media Player
MPlayer
Outro exemplo de como usar o componente Media Player
XPlayer
Exemplo de como fazer um CD-Player
CD-Player
Exemplo de como incomporar um Arquivo Wav no
SoundExe
Executável
Media
Programa que toca CD
MMvolume
Programa que altera o volume de sua placa de som
WaveRec
Programa gravador de Wave totalmente escrito em Delphi
Gráficos
Exemplo de como manipular Gráficos
Grafics Exemplo de como colocar Bitmaps em um Menu
Exemplo de como manipular imagens Gif’s inclusive
MenuBitmap
animados
GifMAnager
Exemplo de como converter um ícone em um Bitmap
IconToBmp
Dll para ser inserida no Explorer. Exibe os dados de um
BmpProp
Bitmap
BtListBox
Como colocar bitmaps em um ListBox e em um ComboBox
MixUp
Exemplo de como desmontar um Bitmap
MoveIcon
Exemplo de como colocar um Icone animado em um form
PieChart
Exemplo de como usar o TChart
TstPr2Fm
Imprime um Bitmap e todas as suas características
RtfToBmp
Exemplo de como converter uma string em Bitmap
Bmp2Tiff
Pequeno pograminha que converte Bitmaps em Tiff´s
BmpGrabb
Programa que pesquisa o HD a procura de ícones
Bmpmenu
Exemplo de como criar menus com glyphs
clipprinter
Exemplo de como imprimir o conteúdo da área de
glyphpro
transferência
glypht Demo para catalogar Glyphs
glyphv11
Outro Demo para catalogar Glyphs
Dragicon
Outro Demo para catalogar Glyphs
Poster Arraste um executável para a janela e extraia seus icones
BmpDraw
Exemplo de como gerar uma imagem a partir de um Edit
Exemplo de como desenhar um bitmap em um form
Sistema
SysDateTime Permite que você altere a data e a hora do sistema
RemoveChave Remove um valor de uma chave do registro
eSetCDAutoRun Ativa o “AutoRun” no Windows.
DelphiCarreg Funções que verificam se o delphi está carregado ou
CloneProgram não
GetCpuSpeed Gera um clone do aplicativo
CPUSpeed Retorna a frequencia do processador usado
TipodeDrive Retorna a velocidade do processador
DetectaDrv Retorna o tipo de unidade referente a letra
DiscoNoDrive especificada.
PercentDisk Verifica as unidades que existem no computador
ExisteDrives Verifica se há disquete no Drive especificado
NumCores Retorna a porcentagem de espaço livre em um Drive
IsPrinter Retorna todos os drives existentes na maquina.
CorrentPrinter Retorna o número de cores da resolução atual.
NumSerie Testa se a impressora está ativa ou não.
TestaPlaca Retorna a impressora padrão do windows.
ShutDown Retorna o Número serial da unidade especificada
KeyLeads Testa se o seu computador possui uma placa de
WindowsDir som.
SystemDir Faz uma reinicilização do computador
TempDir Verifica as teclas Caps, Scroll e NUM sem usar o
SetTaskBar Timer
GetDosEnv Retorna o diretorio onde o windows está instalado
BiosDate Retorna o subdiretorio system do windows
GetPrintN Retorna o Diretorio Temp do Windows
IsTaskbarHid Oculta ou Exibe A Barra de Tarefas
GetMemTP Rotina de resgate das variáveis de ambiente DOS
Portas Retorna a data da fabricação do chip da bios
MemoryReturn Retorna o nome da impressora padrão do Windows
SetWallpaper Verifica se a barra de tarefas do Windows está oculta
ExecExplorer ou não
RControlPanel Retorna a quantidade de memoria que o computador
SWCWin possui
Duas funções que se comunicam com portas seriais
OpIExplorer
Retorna varias informações sobre a memoria do
NetGotoURL
sistema
ROnStartup
Troca o papel de parede do Windows
FormResize
Executa o Windows Explorer a partir de uma
LBClipBoard
determinada pasta
CheckPentium
Executa um módulo do painel de controle (Arquivos
Executa
.CPL)
RetornaBit
Alinha um form baseado nas coordenadas de um
GetBrowser outro
SetJustify Executa o Internet explorer a partir de uma URL
WinCloseProg requerida
CrDisabledBitmap Executa o Netscape a partir de uma URL requerida
DrawTrans Insere um chave no Registro para executar algum
QChangeRes programa
DyResolution Permite que seu form exiba, com fundo, a tela do
TurnOffKey computador
TestaPlaca Envia o conteúdo de um ListBox para a área de
SizeForTaskBar transferência
LetraCDROM Testa se seu processador pentium tem o Bug fatal
CloseCD Executa um programa e espera sua finalização
EjectCD Retorna o valor de cada bit de um determinado byte
LastPos Retorna o Path de seu Browser padrão
IsWindowInMemory Alinha o Menu para a direita do form
ExecuteFile Fecha um aplicativo via Delphi
ExecutaApp Cria um clone Monocromático de um outro Bitmap
EscondeIniciar Redesenha um bitmap trocando a cor da linha do
DiskSpace desenho
Delay Procedure que troca a resolução do seu video
AppIsRunning Função que troca a resolução do seu video
DiskExists Desliga uma Tecla
IsDriveCD Testa se existe uma placa de som no seu
IsFloppy computador
IsNT Expande o Form para a area total da tela
LeMCI Retorna a letra atribuida a unidade de CDRom
MandaMCI Fecha a bandeja do CD-Rom
GetTState Ejeta a bandeja do CD-Rom
CaptureScreenRect Retorna a última posição encontrada em uma string
EnumWindowsProc Testa se a janela ja foi criada
ExploreWeb Executa um aplicativo, já abrindo um arquivo anexo
FileExec Executa o aplicativo somente se ele não estiver
GetExe aberto
GetExetype Oculta/exibe o botão “Inciar” da barra de tarefas
RodaPrograma Retorna o espaço livre em disco
CDinCDROMDrive Promove um estado de espera no aplicativo
OpenCdTray Testa se a sua aplicacao já esta sendo executada
RunOnStartup Testa se existe um disco no Drive especificado
OpenIExplore Testa se a unidade especificada é um CD-Rom
AjustaPapel Testa se a unidade especificada é um Floppy
InfoSys Testa se o sistema operacional é o Windows NT
TarjaLateral Le o Retorno de um Comando MCI
Envia um Comando para um Dispositivo MCI
Testa se uma certa tecla está pressionada ou não
Captura a tela atual em uma área retangular
Retorna todos os programas que estão abertos na
memoria
Executa uma URL a partir do Browser padrão
Tenta executar um programa
Retorna o path do aplicativo que está associado a
um arquivo
Retorna o tipo de executável que é o arquivo.
Tenta executar um programa
Testa se tem CD no CD-Rom.
Abre a bandeja do CD-Rom
Insere um programa na chave “Run” do Registro
Executa uma URL a partir do Internet explorer
Determina um número de cópias para a impressão
Retorna diversas informações do sistema
Gera, no form, uma tarja lateral com um texto
Componentes
AjustaForm Ajusta um form conforme a resolução do monitor
LimpaEdit Limpa Todos os Edit’s de um Form de uma só vez
AddButtonNB Adiciona um botão em um TNotebook
AddButtonTB Adiciona um botão em um TabbedNotebook
Titulo Alinha o título da barra de títulos a Esquerda ou a
ChFBlankText direita
ExportaBMPtoWMF Avisa se algum Edit no formulário não foi preenchido
GetMemoSize Exporta uma imagem de um TImage para um arquivo
StrIsInList Retorna o tamanho de um campo memo.
Insere um Item em um Listbox ou Combobox.
Rede
Redireciona a porta de impressora em tempo de
execução
NetMapPrinter Mapea um Drive de rede via programação
MapeaRede Disconecta uma unidade mapeada via programação
DesconectaRede Retorna o nome do usuário logado na rede (Via
LogUser registro)
WinLogin Retorna o nome do usuário logado na rede (Via
MapeaPasta Sistema)
GetHostName mapea uma pasta via programação
GetIP Retorna o Host onde seu TCP/IP está conectado
LocalIP Retorna o IP da máquina que está conectada
GetNetStation Retorna o Endereço IP de uma maquina
NomeComputador Retorna informações sobre o Computador na rede
NomeDoComputador Retorna o nome da estação na rede
GetNetworkMaps Retorna o nome da estação na rede
Retorna as unidades mapeadas na Estação com
seus paths
Data e Hora
DiasNoMes Retorna quantos dias tem um referido mes do ano
AddicionaHora Adiciona à hora atual um determinado numero de horas.
DifHoras Retorna a diferença entre duas horas
DifDias Retorna a diferenca de dias entre duas datas
DifDateUtil Retorna a quantidade de dias uteis entre duas datas
DateMais Soma um determinado número de dias à data atual
DiaSemana Retorna o dia da semana em Extenso de uma
NomeDoMes determinada data
NumDiasExt Retorna o nome do mes, em extenso, de uma
DataExtenso determinada data
Year Retorna o número de dias calculados em extenso
UltDiadoMes Retorna o extenso de uma determinada data
Minutos Retorna o ano de uma determinada data
Horas Retorna o Ultimo dia do mes de uma determinada data
PeriodoMes Retorna os minutos de uma determinada hora
CorrigeData Retorna a hora de uma determinada hora
AnoBis Retorna o numero correspondente ao periodo
Bug2000 Retorna o ultimo dia de um determinado mes
Datafinal Testa se o ano é Bissexto ou não.
ConverteData Testa se o Windows está preparado para o ano 2000
ChDateFormat Retorna uma data acresçida de um certo número de dias
AjustaData Insere em uma data, um caractere separador
IdadeN Converte o caractere separador de datas para o
IdadeAtual caractere “-”
WeekNum Corrige a data ajustando o ultimo dia do mes
RetornaMes
ProximoDiaUtil Retorna a idade de uma pessoa a partir da data de
PrimeiroDiaUtil nascimento
IsWeekEnd Retorna a idade de uma pessoa a partir da data de
HoraValida nascimento
HoraToMin Retorna quantos fins de semana já se passaram no ano
DiaUtilAnterior Retorna o Extenso do mes da data especificada
DataValida Retorna o próximo dia útil de uma a data
Retorna data do primeiro dia Util do mes
Verifica se uma data cai em um final de semana
Testa se uma string no formato Hora é valida ou não
Converte hora (formato HH:MM) para minutos
Retorna o Ultimo dia Útil de uma data
Testa se uma data é valida
Validação de dados
Testa se uma string pode ser convertida em numero
inteiro
ExisteInt Testa se o CPF é válido ou não
TestaCPF Testa se o CGC é válido ou não
TestaCGC Checa se o Pis é válido ou não
ValidaPis Testa se uma data é válida ou não
ValiData Checa se o Simbolo da UF é Valido
ChecaEstado Testa se o dado é um digito (numero) ou um caractere
Isdigit.zip qualquer
IsImPar Testa de um valor Integer é Impar
IsPar Testa de um valor Integer é par
IsInteger Testa se uma String pode ser convertida em formato
IsAM integer
isStrDateTime Testa se a hora é antes de Meio dia
Testa se uma String pode ser convertida em formato
Data
DataBase
CheckState Checa o estado de uma tabela
AliasCreate Cria um determinado alias temporário
CriaTabela Cria uma tabela
CriaAlias Cria um alias no BDE em tempo de execução
CriaTab Outra função para criar tabelas
AMasterPass Inclui uma senha em uma tabela paradox
RMasterPass Remove uma senha em uma tabela paradox
EsvaziaTabela Esvazia uma tabela especificada
CriaIndice Permite que seu DBF ignore o indice MDX e recrie-o
TipoIndice Retorna de que tipo é o índice especificado
GetPathDoAlias Retorna o Path do Alias
pathalias.zip Outra função que Retorna o Path do Alias
IsRecLocked Testa se um Registro está travado
NumReg.zip Retorna o número do registro atual em tabelas .DB ou
TableCopiReg .DBF
CreateATable Copia todos os registros de uma tabela para outra
DBLoadListQry Cria uma tabela
DBLoadListTbl
FRecno Carrega em um ListBox, os registros de um campo da
LockPDXTable tabela
ValidaCampo Carrega em um ListBox, os registros de um campo da
SetShare tabela
SetAlias Retorna o registro corrente da tabela
RLock Bloqueia uma Tabela paradox.
LockTable Valida campos impedindo a inserção de dado
TableUnlock duplicado
IsRecordLocked Altera o Local Share Via programação
fDbiGetSysVersion Cria um alias em tempo de execução
SetDelete Testa se o registro está travado ou não
TablePack Testa se a tabela esta bloqueada ou nao
DBasePack Desbloqueia uma tabela
AbreExclusivo Testa se o registro da tabela está travado ou não
Retorna informações sobre a versão usada do BDE
Permite que a tabela exiba os registros deletados
Dá um pack em uma Tabela
Efetua um pack em tabelas Dbase
Tenta abrir uma tabela em modo exclusivo
Manipulação de arquivos
DeleteDir Apaga um diretório com todos os seus arquivos.
FDirList.zip Pesquisa arquivos retornando-os em um StringList.
FileCopy Copia um arquivo de um lugar para outro
CopyFile Procedure que copia um arquivo de um lugar para
DirSize outro
NLinhasArq Retorna o Tamanho de um diretório
WinExeWait Retorna o número de linhas que um arquivo possui
PrintImage Executa o aplicativo finalizando-o corretamente apos
ZapFiles o uso.
RecycleBin Tenta imprimir um bitmap selecionado
FillDir Apaga arquivos usando mascaras tipo: *.zip, *.*
ExtractName Envia um arquivo para a lixeira. Requer a unit
FileTypeName Shellapi
CShortcut Retorna todos os arquivos localizados no path
ConverteParaUrl corrente.
DeleteFile Retorna o nome do Arquivo sem extensão
GFLAcTime Retorna descrição do tipo do arquivo. Requer a unit
ShellApi
ProcArq
ProgPath Permite que voce Crie atalhos no Windows
Converte o nome de um arquivo para uma URL
GetFileList
Deleta um arquivo
BarraInvert
FindReplace Retorna a hora do último acesso à um arquivo.
ExecFile Copia ou move arquivos usando a API do Windows
Retorna o Path de onde o programa está sendo
DirList.zip
executado
RemExtens
Retorna um StringList com todos os arquivos de um
SHCopyFiles
diretório
FErase
Insere uma barra invertida após um nome
CriaDir
especificado.
FileVerInfo
Substitui uma string em um campo memo/DBmemo
LoadJPEG Executa um aplicativo Associado
SaveJPEG
Pesquisa arquivos retornando-os em um StringList.
Deltree Retorna o nome do arquivo especificado sem a
IsFileInUse extensão
MkSubDir Copia um arquivo via API do Windows
EditaArq Apaga um arquivo especificado
Cria um diretório
Obtem diversas informações de um arquivo
executável
Carrega uma imagem Jpg
Salva uma imagem Jpg em um arquivo.
Apaga um diretorio
Testa se um certo arquivo está em uso
Cria diretórios e subdiretórios diretamente.
Insere uma linha em um arquivo ASCII.
Diversas
Unit c/funcoes para encriptacao de dados.
Wcrypt2 Unit Com varias funcoes uteis p/Tabelas paradox
dbUtilities Unit que retorna o extenso de um número
Extens Contem funções para você maninpular arquivos via API do
Win95 Windows
Win95File Contem funções para você maninpular paths via da API do
IniFile Windows
Contem funções para você maninpular arquivos .ini
Mais …
Completo programa de FTP
Manipulação de Registro
Revela senhas de Asteristico (****)
Programa de Chat, com versão Servidor e Cliente
Programa Hacker de verificação de portas por IP
Exemplo de CD-Player
Exemplo de utilização do DirectX
Exemplo de Sistema de E-Mail
Muito cuidado com estes exemplos - São na verdade
dois exemplos que estão compactados. Ambos limpam
as informações da CMOS.
Este é uma linguagem Script para o Microsof Windows.
Isto é capaz de destruir seu computador, desde que
que você não aceitr scripts de outras pessoas. O
criador deste programa não se responsabiliza pelos
dados que possam causar, este programa é apenas
instrutivo.
Visualiza, Procura e Captura ícones de aplicações.
Visualiza e Captura Icones, é necessário RXLib
Programa que envia mensagens de ICQ
Manipula a CMOS
Outro programinha que manipula a CMOS
Exemplo de Delay
Outro de manipulação de CMOS
Exemplo de criação de links de internet em
formulários
Captura o IP da Máquina
Exemplo bastante interessante, vou deixar que você
mesmo veja!
Mais um exemplo de manipulação de BIOS - CMOS
Mais um exemplo de manipulação de BIOS - CMOS
Exemplo que calcula a virada de um novo ano,
conforme religião ortodoxa… (ridiculo!)
Registra todas os sites visitados em seu computador.
WebBrowser em Delphi
Exemplo de abrir e fechar o drive de CD-ROM do
computador
Para quem trabalha com desenvolvimento de Sistemas
voltado a internet, vale a pena dar uma olhada.
Exemplo de sistema de e-mail, para envio de arquivos
atachados
Converte Temperatura de Celsus em Farenait e vice-
verca
Conversor de Metragens
Detecta portas LPT e COM
Proteção de Tela
Um Editor de Textos bem diferente.
Conversor de DBE
Move sua janela
Exemplos de Formulários transparentes
Conecta a servidores e elimina cookies
Editor de Textos, acompanha componentes.
Dial Up em Delphi - Acompanha componente
Programa de discagem com Dial-up… Bom!
Excelente Programa de conversação on-line, como se
fosse um ICQ, com versão Servidor e Cliente…
Exemplo de Jogo, estilo guerra nas estrelas…
combatendo asteróides.
Utilizando botão para apagar os Edits de um
Formulário.
Jogo Tetris
Exemplo de Visualizador de Vídeos AVI
Belo exemplo de calendário
Exemplo de edição e visualização de arquivos
Componente para tratar o Alias do BDE
Programa onde você pode escolher a mudança de
idiomas em tempo real.
Programinha de Datilografia
Componente conversor de Data em Dias
Componente para Icone animado no Formulário
Componente que detecta as portas COM
Programa que executa o Note Pad ou edição do
Autoexec.bat - Inclui componentes
PRograma de Dial Up - Acompanha os componentes
Programa de Rodar Músicas
PRocura e visualiza imagens em um diretório
Brincadeira de troca de icones na hora de sair do
programa
Learn Sockets - PRograma de redes e conversa em
chat
Exemplo de ADO
Programa que ensina sobre o Registro do Windows
Programa que captura a tela do Desktop
PRograma que captura a velocidade atual de seu
processador
PEga IP das Máquinas conectadas
Ótimo programa de localização e descrição de arquivos
Cálculos
Exemplo interessante…
Editor de Textos para Pascal
MUITO BOM!! Revela senha de ****
Editor de Textos
Veja por sí só!!
Programa para se cadastrar em diversos Sites de
Busca
Encripta arquivos textos
Captura imagens, conforme coordenadas
Habilita e desabilita as funções do Windows
Extrai ícones de executáveis.
Tudo isso em um único CD!!!
Agora pense um pouco…
Quanto tempo você acha que levaria
para baixar isso tudo da Internet, ou
pior, quanto tempo levaria para você
encontrar todo esse material!!
Então, o que você está fazendo ai?
Compre já!!!!
Entre em contato pelo e-mail lloydsoft@uol.com.br ou
lloydsoft@ig.com.br e saiba como proceder para adquirir
esta poderosa arma!!
Menu Principal
Componentes Para Delphi 5
Backup e ZIP
UBackup Pro v6.5
VCLZip v2.21.32 Sources
Xceed ZIP v4.1
ZipTV v2.52.21
ZipTV v2.52 Source Code
Coletâneas
1st Class Professional 2000.5
ABC Pro v5.2.2
abfAPM v1.0.9.27
abfComboBoxes v1.0.9.27
abfDialogs v1.0.9.27
abfMenus v1.0.9.27
abfStatusBars v1.0.9.27
abfWab v1.0.9.27
Adrock Suite
AHM TritonTools 2000 06August2000
Alvas Component Collection v1.5
BUPack Component Package v1.4
DevExpress Journal
DevExpress DateSuite v1.0
DevExpress DBTreeView v1.1
DevExpress DBTreeView v1.1\Source
DevExpress Quantum Grid v2.2
DevExpress MemData v1.5
DevExpress Flowchart v1.0
DevExpress Flowchart v1.0\Source
DevExpress ExpressBars v3.1
DevExpress MasterView v1.0
DevExpress ForumLibrary Suite v1.1
DevExpress Printing System v1.0
DevExpress Printing System v1.0\Source
DevExpress Inspector Suite v1.1
DevExpress Orgchart v1.1
Dream Calendar v1.1
Dream Controls v3.51
Dream dHelp For Delphi
Dream Designer v3.1 Delphi 5
Dream Font Color v1.0b
Dream Inspector v3.1 Delphi 5
Dream InfoTree v2.51
Dream Memo v3.1
Dream Outbar 2.1 Source
Dream Scripter v3.51
Eldos ElPack v2.60
Genesis 3.0
G.L.A.D v2.1
KS Extra Pack v1.6
LMD Tools v5.01.02
Opaque Venus v5.0e
Raize Components v2.51c
RxLib 2.75 Fixed
TMS Pack Ago2000
Comunicação
Exceltel Teletools Enterprise v3.5.2
IOComps v1.1.4 SP6
IOPort v2.1
MemPort v1.0
TComport v1.5
Database Engines
Instalação do DAO 3.5
Instalação do DAO 3.6
Databases
ADO Component Suite v1.0
Adonis Component Suite v4.0
ADOX Component Suite v1.1
Advantage TDataset v2.7.0.1
Apollo Database Server v5.14
Apollo VCL v5.14.1 FS
Apollo OLE DB v5.14.1 RT
Apollo SQL v5.14.1 RT
ASTA v2.1
ASTA v2.1\ASTA Query Builder
ASTA v2.1\ASTA Server Launcher
ASTA v2.1\ASTA Servers
ASTA v2.1\ASTA Tools
ASTA v2.1\ASTA Tutorial
CodeBase Components II v2.63
Cooldev DBUtilities v1.02
DAO Database Collection v3.5 for DAO 3.5
DAO Database Collection v3.5 for DAO 3.6
DB Extender v2.6
DBISAM v2.03
DbOvernet 2000
Diamond Metadata 2000 v2.3
Diamond ADO v1.75
Diamond Access v1.97
Direct Oracle Access v3.4.1
Dream FilterBox v1.1
Etv Library v3.3
GM DAO Components v3.8
Halcyon v6.60.00
InfoPower Professional 2000.17
Interbase Encryption Proxy v1.0
InterbaseObjects v3.5Bd
JRO Component Suite v1.1
Kamiak ADO v1.1.8
MiniTable v5.0b
MK Query Builder v2.15
Multilizer VCL v4.2.19
ODBC Express v5.06
Oracle Data Access v2.10
Real Database Controls Delphi 5
Rubicon v2.08b
Shazam Power Query v4.0
Simple Query Pack v2.5b
SQL Direct 2.6
Titan Access 2000 v5.00r D5
Titan Access 2000 v4.08r D4
Titan Btrieve 2000 v5.00h D5
Titan SqlAnywhere 2000 v5.00q D5
Titan SqlAnywhere 2000 v4.08q D4
TMemDataSet v2.12 Source
Topaz v7.5
TxQuery v1.60
Freeware
AHM Freeware Mar2000
AHM Package Solution Mar2000
AntiAlias Label v1.1
APR Dialogs v1.2
BB Database Desktop v0.1.3.0
BorderColor v1.1
Browser Folder Dialog
Button Components
ButtonComponents
Color Picker Button v1.2
ExDBGrid v2.1
Explorer Button
Export to Excel v1.2
Expression Eval v1.04
Expression Builder v1.15
Expression Parser v1.65
Extension unit for Graphics.pas GraphicEx v8.7
FlatStyle v2.0
Fluid Panel v1.0
Folding Panel v1.3
HKHelp v1.1
Huge Integer Tools v2.05
JLAqua v1.2
KaDAO 1.9
KBM MemTable v2.01
LCD 99 v1.64
LCDScreen v2.2
MagRAS v4.0
ML Buttons v1.5
MMEMatrix Class v0.2b
MotoMeter v2.0
Mpeg Audio Tools
NC OCI8 Oracle 8i Library v0.5.2
NumWords v4.3
OutLook Library v1.0
Paradox Tables Repair v4.10
PBEditPack v3.10
PBWebLabels v1.0
Print Preview v3.0
QR Rounded Rectangles
Quick Report Editor v2.1
ScreenSaver v3.0
SmoothShow v1.21
StatusBar Pro v1.0
System TaskBar v1.0
TAPInstanceCheck v1.5
TAPNetscape Labels v1.4
TCESRunning v1.0
TDiskInfo v2.0
TextFader v1.0
TFindFile v1.1
THeartMachine v0.03
TIAeverMainMenu v2.04
Time Watch v1.3.2
TIniPlus v1.12
TMailer
TMGDBSessionCache v1.0
TNetwork Connection
Toolbar97 v1.76
ToolBar97 Add-ons v1.8
TPhantom v5.1
TPicShow v2.2
TRasWinGod
TRegistryIniPlus v1.12
TRotate Image v1.0
TRTFSnapShot v1.0
TSHChangeNotify v1.0
TStringAlignGrid v2.0
TstrRandonGen v1.0
VG VCL Library v5.2
WhoIs v1.1
Year Planner v1.8
Geral
Anyshape Transpack Src
Auto Upgrader v2.0
Calendar Works v1.1a
Clipper Functions v5.1
Color Memo 2.02
Cool Controls v2.08 FS
Cooldev TipsSystem v2.0 FS
CoolForms Delphi 5
Cordaware MidasCollection v1.0
Cordaware CompViewer v0.95
Cordaware TCWStretcher v2.0
Cordaware GridEditor v0.95
CUESoft CUEXml Delphi v2.0
CUESoft CUEXsl Delphi v1.0
Delphi ICQ
Designer Forms 1.2
DiskScanner v1.0
EhLib v1.56
Evgesoft ExtraPack Library v1.5
Excel Component Suite v1.0
FileStorage for Delphi
Flex Controls v2.0
Form Container v1.5
Founder Library v2.4
Gd Plugin System v1.5
HLC Package
Import Export Wizard Delphi 5
Interactive Disassembler Pro 385b
ISG TFormGenWin Component v3.5
ISG Visual Toolpak v1.5
MagicHints v1.65
Magnet And Glue source
Math interpreter v1.0
Newtone ResizeKit VCL v1.0
O2aAgents v1.0
ObjectStream
Office Component Suite v1.0
Organic Shape Button v2.0
Organic Shape Form v2.0
Organic Shape Image v2.0
Organic Shape Shifter v2.0
PerfectSizer VCL v3.0
PGP Components v1.2.2
PIMFlash Pro v1.23
Plusmemo v5.2
ProHelp v1.1
PSettings v3.0
Python For Delphi v3.15
Real Edit Controls Delphi 5
Real Forms v6.0 Beta
Real Forms v5.5
Skin Form & Builder v2.12
TAnimationFX v2.0
TAspiInterface v1.0
TJstick v1.1
TLayers v1.2
TPack Files v1.3
TransitionFX v4.01
TrichView v1.2
TRSOFT Office 97 Controls v1.4
TSyntax Memo Collection
TVisual Cue Burner v1.0
Unit CRT 2.05 para Delphi 5
UtilMind krpRegions
VertCalc v1.0
WebLabels Component Pack v1.1
WIH Delphi Calculator v1.0
Word Component Suite v1.0
WPTools v3.08
XLSReadWrite v1.32
Graficos e Imagens
CadoDraw Suite v3.03
Duck Barcode v1.2d
Envision Image Library v1.04
FreeBarcode v1.16
ImageEn v1.8 Source
ImageLib Corporate Suite v5.0
ImagXpress Professional v5.0
JPeg Component Library v1.6a
Mountain Top Barcode
TBarcode v3.22
TeeChart Pro v4.03
Grids & Tree
Diamond Grid 1.15
Eldos ElTree v2.60
Grid Collection v4.3.6
Hypergrid 2.0
SftTree VCL v4.02
TDBGrid Pro v3.0
TeeTree v1.03
Top Grid 2.01
XLGrid v1.6
Instalação
InnoSetup 32 v1.3.16
Youseful 32 v5.01c
Internet
Active IRC v1.04
AspExpress v1.1 D5
CGI Expert Exemplos
CGIExpert Professional v5.0.6
DXSock v2.09b Enterprise
FTP Client Engine v2.0.8
HTML Components Suite v7.25
HTML Tools v1.0
ICK 2.0 for Delphi
ICS - Internet Component Suite v2.50
Internet Mail Suite v2.02
IP Works SSL v4.0
ISG TMapi Component v2.5
NetMasters FastNet VCL v5.6.4
Nevrona Intraweb v2.0a
Pixel Pack v2.0
TCustomIRC v1.02
THTMLViewer Professional v7.22
WebApp v2.5 Professional and Server Edition
WebScript Control v1.0
WinInet Component Suite v1.01 D5
LEDs e Displays
Abakus VCL v2.01
Varian Led Studio v3.29
Multimedia
CDDB Component
Dtalk v2.0 FS
Enhanced Wave v2.0
Enhanced Avicap v2.04
Enhanced Twain v2.09
Enhanced Speech v1.4
MMTools v1.7 Setup
mPlayer
Multimedia Developer Suite v2.01
WaveIO v1.0
NT e Novell
Novell Libraries for Delphi
NTSet v1.07a
NTSet v1.08
NWLib 5.0
SvCom Components v4.0
Protecão e Criptografia
ISG CS Secure v2.5
Lock&Key v1.05
Manna 1.5
RT Registration Control for Wise 2.13
RT Registration Control VCL 2.16
Softlocx ActiveX v3.01
SoftSENTRY v3 E-Commerce Edition
TGenSerial v1.1 For Delphi 5
TSM Blowfish 1.15
TSM DES 1.15
TSM RC6 1.15
TSM RSA 1.15
TSM SHA 1.15
TSM TwoFish 1.15
UIL Security System v2.0.7
Relatorios
ACE Reporter Pro v1.24
ExtraDevices for RBuilder v1.7
FastReport v2.30 Full
QRDesign v1.2
Quick Report Pro v3.05 D4
Quick Report Pro v3.07 D5
Quick Report Powerpack v1.10a
ReportPrinter Pro v3.00G
ReportPrinter Pro v3.00G\Additional_Samples
ReportPrinter Pro v3.00G\FAQs
Report Builder Enterprise v5.0 D4
Report Builder Enterprise v5.0 D5
RTF Report Generator v1.02
Shazam Report Wizard v4.1
TbPrint v2.5
Virtual Print Engine v3.1
Sistema
Plasmatech Shell Control Pack v1.5
Shell Browser v2.1
SystemWorks VCL for Delphi 1.1
TWheelMouse v1.20
X2000 v2.0
Spelling
Addict Spell Check v2.34
EDSSpell v3.51
Traducao
TsiLang Components Suite v4.9
Trayicon e Menus
Animated Tray Icon 3.0 Delphi 5
Animated Menus 2000 v2.3
Coolmenus Pro v1.09
CoolMenus Standard v3.07.2
CoolMenus Multimedia v3.07.2 FS
TDCMinTray
Turbopower
Abbrevia v2.04
Async Professional v3.02
Essentials v1.08
LockBox v1.07
Memory Sleuth v1.59
Office Partner v1.5
OnGuard v1.10
Orpheus v3.07
SysTools v3.01
Experts
CDK v5.03a
ClassExplorer 4.04 Delphi 5
CodeRush Plug-ins
CodeRush Professional v5.03h.1
CodeSite v1.12
DB Complete Expert
Event Journal v1.01
ExceptionalMagic v1.51
FormExplorer D5 v2.01
Opaque WithPalette v1.0
Opaque WithStyle v5.0g
Opaque WithView v5.0g
ProDelphi v8.1
reAct v5.09a
Resource Grabber v2.5
Structured Storage Library 1.2d.source
Delphi 5 Updates
Delphi 5 Enterprise Update Pack 1
Help Updates
Mensagens em Português Delphi 5
Observação
Tudo isso em um único CD!!!
Agora pense um pouco…
Quanto tempo você acha que levaria
para baixar isso tudo da Internet, ou
pior, quanto tempo levaria para você
encontrar todo esse material!!
Então, o que você está fazendo ai?
Compre já!!!!
Entre em contato pelo e-mail lloydsoft@uol.com.br ou
lloydsoft@ig.com.br e saiba como proceder para adquirir
esta poderosa arma!!
Menu Principal
Componentes Para Delphi 6
1st Class Professional v3000.0.A
Abakus VCL 2.41
abfComponents Library Full Free
ACE Reporter Pro v1.25
ADDICT SPELLCHECK & THESAURUS 3.2
AHM Triton Tools
All for Novell
All for WinNT
Alvas Components Collection 3.1
AMARun 1.1
Animation Effects 3.0
Apollo VCL v5.2RC5
AppBar 1.4
AppControls Suite 1.0
AppControls v2.21
Application Launcher 1.2
Auto Upgrader 3.2
AutoRefreshTable/Query 1.0
BFC 1.5
Blind Guardian 1.2
BS Components 3.0
BUPack Component Package 2.0
CadoDraw for Delphi 4.1
CaptionButton v3.4
CDEvents 1.44
CGIExpert Professional v6.0.1
CheckDoc 1.0
Classic Component Set 2.23
Client Server Via TCP/IP
Clipper Functions 5.01
CodeRush Professional v6.03k Beta
CodeSite 2.0
Cool DbUtilities 1.04
CoolDBUtilities v1.04a
CoolHints 2000 v1.01a
CoolMenus Multimedia Standard 3.08
CoolMenus Pro v2.02a
CopySort 2.0
Cristal Report vcl 8.5
Db Progress 2.7
DBI SAM Database System 3.03
DBISAM Client-Server v3.03
DBISAM v2.12
dbOvernet v2.6
Defined Forms Pro v6.1.1
DefinedForms Pro v 6.1.1
DevExpress Bars Pro Suite v4.1.1
DevExpress DBTreeView v1.3
DevExpress Inspector Suite v2.0
DevExpress Layout Control v1.0
DevExpress MasterView v1.2
DevExpress MemData v1.8
DevExpress OrgChart v1.3
DevExpress PageControl v1.0
DevExpress Printing System v2.1.1
DevExpress QuantumGrid Pro v3.2.
Dialog Builder 1.3
Diamond Access v2.0
Direct Oracle Access v3.4.5
Disk Free Monitor 1.02
Disk Visor 1.3
Drag and Drop Component Suite 4.0
Dream Calendar 1.0
DualLang
DXSock Enterprise 2.2
Easy Table 2.05
EhLib 2.0
Elastic Forms 6.0
Eldos ElPack v2.80
EMS QuickExport Suite v1.95
EnhSpeech
Envision Image Library 1.12
ESBDates v1.8.2 1.8.2
Eureka Exception Logger 3.1
ExcelTel Teletools Enterprise 3.6
Extended TabControl 2.14
ExtraDevices for ReportBuilder v1.83
File Find
Flat Style Components 2.0
FlatAll with Source 2.0
Folding Panel 1.0
FormHelp 3.4
FormMagnet 2.1
FormMagnet v2.2
Free BarCode 1.16
FullScreen
Halcyon v6.7
IBX for Delphi 6 v6.01
IE Availability, Version and Information Component 4.5
ImageEn v1.97b
ImageLib Corp Suite v6.0
ImageXpress 6.0
ImagXpress Professional v5.03
InfoPower Professional v3000.1
Interbase Objects v4.2Eg
Interbase Objects v4.2Eg
Internet Direct (Indy)
IP Works SSL v5.0
IP Works v5.0
Jazmine Components Pro v2.0
JCW Jazmine Calendar PIM Widgets Suite 2.0
Jedi - VCL Beta 1 B 1
KrpRegions Library v1.41.171
KS Development SkinEngine 2.4.8
KS Extra Pack 2.1
KSDev ExtraPack v2.10
KSDev SkinEngine v2.4.8
Layers Package 1.2
LCD Screen
LMD Tools Pro v5.06
Multilizer VCL v5.0
Nevrona Rave Borland Edition v4.05
NTSet v1.10
NWLib 5.0
Office VCL Component 3.2
Opaque Venus v6.0a
Oracle Data Access Components 3.20
PDF Library v4.0.1
Pim Flash Professional 1.36
PIMFlash Pro v1.36
Plasmatech Shell Control Pack v1.6
PsFastReport Filters
PsLookupPack v1.5
psvDialogs Library 1.7
Quick Report Design + HTML + PowerPack 3.6
QuickReport HTML Export Filter
QuickReport PowerPack v1.20
QuickReport Professional v3.5
Raize Components v2.52
Report Builder - TExtraDevices 1.83
ReportBuilder Enterprise v6.03
Rubicon v2.10
Runner
RxLib v2.75
Shazam Power Query v4.0e2
Shazam Report Wizard v4.0e2
Shell Browser Control Pack 2.31
Simple Query Pro v2.95
SmartScan Xpress ICR. 3.03
SMExport Suite v3.90
SMImport Suite v1.35
Sql Direct 2.8
SQL Direct v2.8
SvCom Components 5.01
SvCom v5.01
TBarCode 3.22
TCompLHA v6.04
TCompress v6.01
TeeChart Pro v5.02
TGlobe 4.07
THTML Components v8.20
TinyDB Engine v2.6
Titan Btrieve 2001 v6.0
TMagRas - Delphi RAS Component
TMemDataSet v2.15
TMS Component Pack 31AGO2001 v2.0
TMySQLComponents 2001
Toolbar2000
Topaz v8.0
TopGrid 2.20
TopGrid 26AGO v2.20
TPasScript 6.0
TSintax Memo Collection 4.5
TSmtpRelay Server 1.14
TSyntaxMemo v3.00.36
TurboPower Abbrevia v3.01
TurboPower Async Professional ActiveX
TurboPower Async Professional v4.
TurboPower Essentials v1.09
TurboPower FlashFiler v2.04
TurboPower Internet Professional v1.11
TurboPower LockBox v2.03
TurboPower Memory Sleuth for Delphi v2.0 Full
TurboPower Office Partner v1.61
TurboPower OnGuard v1.11
TurboPower Orpheus v4.01
TurboPower Partner Professional v2.53
TurboPower Sleuth QA Suite v2.03 Full
TurboPower SysTools v3.03TurboDB Components
v3.21.49
TurboSync Palm Conduite 1.0
TWinReboot component 1.0
TxQuery v1.70
UIL Security System 2.08
UIL Security System v2.0.8
Varian Led Studio WorkShop D6
Venus - Opaque Software 6.0b
Volga DB 3.0
Wilmark Wizard Suite
Windows Standard Serial Comm Libary v3.16
WpTools 3.10d
WPTools Bundle v3.1.0d
Xceed Winsock Library 1.0
Xceed Zip Compression Library 4.2
XLS ReadWrite WITH SOURCE 1.35
XLSReadWrite v1.35
Youseful Native VCL int. Components 5.11
Ziegler Collection One v2.10
ZipTV 4.1.4
ZipTV v3.52.22
ZipTV v4.1.4b
Observação
Tudo isso em um único CD!!!
Help Tools
Help And Manual v2.7b1263
HelpScribble v5.5.2
HelpWriter Pro v4.3.1 For Delphi
RoboHELP Office v9.1
Time2Help v1.0.38.17
Windows Help Designer HTML Edition v3.0R2
Windows Help Designer Professional v2.3.5
Windows Help Designer Winhelp Edition v3.1.14
Instaladores
InstallShield DemoShield v6.71
InstallShield Package for The Web v3.0
Installshield Professional SE v6.30
Installshield.Express.v3.51
Wise for Windows Installer Professional v3.1
Wise for Windows 9.01
Modelagem de Dados e divs
Case Studio 2.7
Database Designer v5.48
EMS Quickdesk v1.7.10.14
Erwin v4.0
GrantManager v2.0.2.22
IBAdmin v3.1.1.350
IBExpert v2.5
Marathon v1.6.20
ModelMaker.v6.0
PL.SQL.Developer.v4.02.410.WinALL.Retail-SSG
Rational Rose 2000 Enterprise Edition
Outros
AQTime v1.1.1
cdk.v5.03a
Class.explorer.v4.04.delphi5
Code Site pro 2.0 for delphi56
DB.complete.expert.d5
Delphi Speed Tools v1.0
EXE2DPR v3.1
ProDelphi v8.1
Project Print for Delphi v1.2.6
react.v5.09a
Resource Grabber v2.5
Numega BoundsChecker v6.5 Delphi Edition
PocketStudioPro
Bônus
Ícone, Imagens, Botões, etc
Livros e Apostilas (PC-MASTERING DELPHI 6 E-
BOOK, Delphi Technical Reference Card VII, DELPHI
TECHNICAL REFERENCE.PDF)
Multimedia Developer Suite v2.01
Observação
Tudo isso em um único CD!!!
AR e
Estado/Taxas Sedex Total
Caixa
SE R$ 8,00 R$ 4,20 R$ 12,20
AL, BA, PB, PE R$ 18,00 R$ 4,20 R$ 22,20
CE, RN R$ 22,00 R$ 4,20 R$ 26,20
DF, ES, MA,
R$ 26,00 R$ 4,20 R$ 30,20
MG
GO, PA, PI, RJ R$ 28,00 R$ 4,20 R$ 32,20
MS, SP R$ 30,00 R$ 4,20 R$ 34,20
AP, MT, PR,
R$ 33,00 R$ 4,20 R$ 37,20
SC, TO
AM, RS R$ 37,00 R$ 4,20 R$ 40,20
RO, RR R$ 40,00 R$ 4,20 R$ 44,20
AC R$ 44,00 R$ 4,20 R$ 48,00
Tabela de Encomenda Normal
7 à 15 dias para entrega
AR e
Estado/Taxas E.N. Total
Caixa
R$
SE R$ 4,20 R$ 10,20
6,00
R$
AL, BA, PB, PE R$ 4,20 R$ 10,70
6,50
R$
CE, RN R$ 4,20 R$ 11,20
7,50
DF, ES, MA, MG, PI, R$
R$ 4,20 R$ 12,20
RJ, TO 8,00
R$
AP, GO, SP R$ 4,20 R$ 12,70
8,50
R$
MS, MT, PA, PR, SC R$ 4,20 R$ 13,20
9,00
R$
RS R$ 4,20 R$ 13,70
9,50
R$
RO, RR R$ 4,20 R$ 14,20
10,00
R$
AC, AM R$ 4,20 R$ 15,20
11,00
INFORMAÇÕES
ATUALIZAÇÕES
- Versão 3.2.1.11
Reconhecimento da Janela ativa: Pasta, WEBSite ou
Programa; Obs: WEBSite só reconhecido quando usado
o Internet Explorer;
Modificação das cores utilizadas no espião:
Marrom=Informações Adicionais do Espião, Azul=Pasta
Ativa, Azul-escuro=Programa ativo, Roxo=WEBSite
ativo, Vermelho=Fechamento de Janelas, Verde=Texto
digitado;
- Versão 3.2.1.12
Correção de BUGS no Instalador;
CONFIGURAÇÕES
- Opções Avançadas
- Espionagem Automática: Esta opção faz com que o
espião se auto-execute todas as vezes que o windows
iniciar;
- Parar Espionagem automática: Esta opção serve
para quando o serviço de espionagem seja temporário.
Então é só definir a data a qual ele deve parar de
espionar. Obs.: A data deve ser escolhida usando o
Mouse.
- Mostrar teclas especiais: Por definição e para uma
melhor visualização as teclas tipo: (Ctrl, Alt, F1..F12,
Shift, Caps Lock, etc..) não aparecem na captura de
teclas. Porém está opção ativa a captura delas.
- Mostrar fechamento de Programas: Esta opção faz
com que o espião relate também quando os programas
forem fechados.
- Senha de Acesso
Opção para modificar a senha padrão.
- Atual: Digite a senha atual;
- Nova: Digite a nova senha de acesso ao espião;
- Re-digite a Nova: Re-digite a nova senha de Acesso.
(Para não haver erros)
- Botão OK: Confirma a alteração da senha
- Botão Cancelar: Cancela o processo de troca de
senha
- Outras Opções
- Decodificador: Este botão executa o decodificador do
espião. Esse qual você usará para ler os arquivos
antigos de captura. Nele você encontra três botões que
servem respectivamente: Abrir os arquivos existentes,
Imprimir o texto visualizado e fechar o decodificador.
- Apagar: Apaga todos os arquivos de espionagem
criados anteriormente. CUIDADO: Está opção apaga o
diretório “SPY” e o recria, então não copie nada para
essa pasta!!!
- Esconder: Esconde o espião rapidamente. Você pode
utilizar também a tecla F12 ou até Alt+F4.
- Desativar: Desativa o uso do espião. Caso a opção
Espionagem Automática estiver ativada o espião entrará
em ação novamente assim que o Windows reiniciar.
- Ícone na barra de tarefas
- Mostrar Ícone na Bandeja: Mostra o ícone escolhido
na bandeja da barra de tarefas.
- Barra de Arrasto: Escolha o ícone que deve aparecer.
- Texto: Digite o texto que deve aparecer ao se passar o
mouse no ícone da bandeja.
PASSWORDS
REGISTRO
COMPATIBILIDADE
é isso…
Publicidade
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs
,ShellAPI, Menus;
const
wm_IconMessage = wm_User;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
Lloyd1: TMenuItem;
close1: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure close1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Lloyd1Click(Sender: TObject);
private
procedure IconTray (var Msg: TMessage);
message wm_IconMessage;
{ Private declarations }
public
{ Public declarations }
nid: TNotifyIconData;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
begin
// carrega o ícone inicial
Icon.Handle := LoadIcon (HInstance,
‘MAINICON’);
// preenche os dados da estrutura
NotifyIcon
nid.cbSize := sizeof (nid);
nid.wnd := Handle;
nid.uID := 1; // Identificador do ícone
nid.uCallBAckMessage := wm_IconMessage;
nid.hIcon := Icon.Handle;
nid.szTip := ‘LloydSoft’;
nid.uFlags := nif_Message or
nif_Icon or nif_Tip;
Shell_NotifyIcon (NIM_ADD, @nid);
end;
procedure TForm1.close1Click(Sender:
TObject);
begin
form1.close;
end;
procedure TForm1.FormDestroy(Sender:
TObject);
begin
nid.uFlags := 0;
Shell_NotifyIcon (NIM_DELETE, @nid);
end;
procedure TForm1.Lloyd1Click(Sender:
TObject);
begin
Showmessage(‘LloydSoft é D+’); {Menu
Popup}
end;
end.
Idade
// Programador - Paulo Alexsandro Freitas
de Miranda <- The Programmer ->
// dprogrammer@ieg.com.br
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Mask;
type
TForm1 = class(TForm)
meNasc: TMaskEdit;
Label1: TLabel;
SpeedButton1: TSpeedButton;
edIdade: TEdit;
Label2: TLabel;
BitBtn1: TBitBtn;
Label3: TLabel;
edDias: TEdit;
function Bissexto(AYear: Integer):
Boolean;
function DiasDoMes(AYear, AMonth:
Integer): Integer;
function Idade2(DataNasc : TDate) :
String;
function Dias(Data : TDate) : String;
function Idade(Nasc : TDate) : String;
procedure SpeedButton1Click(Sender:
TObject);
procedure meNascKeyDown(Sender: TObject;
var Key: Word;
Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
If Ano = 0 then
Delete(Idade, 1, 1);
Result := Idade;
end;
Delete(Meses, 1, 2);
if Length(Meses) = 1 then
Meses := Meses + ‘0’;
Result := IdadeReal;
end;
procedure TForm1.SpeedButton1Click(Sender:
TObject);
begin
edDias.Text :=
Dias(StrToDate(meNasc.Text));
edIdade.Text :=
Idade2(StrToDate(meNasc.Text));
end;
procedure TForm1.meNascKeyDown(Sender:
TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 13 then begin
SpeedButton1.Click;
Key := 0;
end;
end;
end.
Splash Screen Com Progresso
program Granja;
// Programador - José Jornando de Carvalho
Júnior <- Lloyd Dickinson ->
// lloydsoft@uol.com.br
uses
Forms,
Principalf in ‘Principalf.pas’
{Principal},
Areaf in ‘Areaf.pas’ {Area},
Galpaof in ‘Galpaof.pas’ {Galpao},
Clientef in ‘Clientef.pas’ {Cliente},
Saidaf in ‘Saidaf.pas’ {Saida},
Relatoriof in ‘Relatoriof.pas’
{Relatorio},
baixaf in ‘baixaf.pas’ {Baixa},
Mortalidadef in ‘Mortalidadef.pas’
{Mortalidade},
manubaixaf in ‘manubaixaf.pas’
{Manubaixa},
ConsEstoquef in ‘ConsEstoquef.pas’
{ConsEstoque},
sobref in ‘sobref.pas’ {Sobre},
ImpRelatoriof in ‘ImpRelatoriof.pas’
{ImpRelatorio},
Consultasf in ‘Consultasf.pas’
{Consultas},
ImpEntradaf in ‘ImpEntradaf.pas’
{ImpEntrada},
PassWord in ‘PassWord.pas’
{PasswordDlg},
ImpMortalidadef in ‘ImpMortalidadef.pas’
{ImpMortalidade},
ImpSaidaf in ‘ImpSaidaf.pas’ {ImpSaida},
ImpClientesf in ‘ImpClientesf.pas’
{ImpClientes},
Apres2f in ‘Apres2f.pas’ {Apres},
Entradaf in ‘Entradaf.pas’ {Entrada};
{$R *.RES}
var
i:shortint;
maximo:shortint=0;
divisor:shortint=19;
begin
Application.Initialize;
Application.Title := ‘GSJ2 - LloydSoft’;
with TApres.Create(nil) do
try
Gauge1.MaxValue:=100;
Show;
Update;
Panel1.caption:=‘Criando Tela:
Principal’;
Panel1.Repaint;
Application.CreateForm(TPrincipal,
Principal);
for i:=1 to (maximo+(100 div divisor))
do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Cadastro
de Entradas’;
Panel1.Repaint;
Application.CreateForm(TEntrada, Entrada);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Cadastro
de Mortalidade’;
Panel1.Repaint;
Application.CreateForm(TImpMortalidade,
ImpMortalidade);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Impressão
de Saida’;
Panel1.Repaint;
Application.CreateForm(TImpSaida,
ImpSaida);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Impressão
de Clientes’;
Panel1.Repaint;
Application.CreateForm(TImpClientes,
ImpClientes);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela:
Password’;
Panel1.Repaint;
Application.CreateForm(TPasswordDlg,
PasswordDlg);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela:
Consultas’;
Panel1.Repaint;
Application.CreateForm(TConsultas,
Consultas);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Impressão
de Entradas’;
Panel1.Repaint;
Application.CreateForm(TImpEntrada,
ImpEntrada);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Impressão
de Relatório’;
Panel1.Repaint;
Application.CreateForm(TImpRelatorio,
ImpRelatorio);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Estoque’;
Panel1.Repaint;
Application.CreateForm(TConsEstoque,
ConsEstoque);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Sobre’;
Panel1.Repaint;
Application.CreateForm(TSobre, Sobre);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Cadastro
de Entradas’;
Panel1.Repaint;
Application.CreateForm(TArea, Area);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Cadastro
de Galpão’;
Panel1.Repaint;
Application.CreateForm(TGalpao, Galpao);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Cadastro
de Clientes’;
Panel1.Repaint;
Application.CreateForm(TCliente, Cliente);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Cadastro
de Saídas’;
Panel1.Repaint;
Application.CreateForm(TSaida, Saida);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela:
Relatório’;
Panel1.Repaint;
Application.CreateForm(TRelatorio,
Relatorio);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela: Baixa’;
Panel1.Repaint;
Application.CreateForm(TBaixa, Baixa);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela:
Mortalidade’;
Panel1.Repaint;
Application.CreateForm(TMortalidade,
Mortalidade);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Criando Tela:
Manutenção’;
Panel1.Repaint;
Application.CreateForm(TManubaixa,
Manubaixa);
for i:=maximo to (maximo+(100 div
divisor)) do
begin
gauge1.progress:=i;
maximo:=i;
end;
Panel1.caption:=‘Finalizando’;
Panel1.Repaint;
finally
Free;
end;
Application.Run;
end.
Arquivos
1. Abrir arquivos com aplicativo associado
2. Adiciona a barra invertida a um texto
selecionado
3. Apagar arquivos via MS-DOS
4. Apagar um subdiretório
5. Como extrair o tamanho de um arquivo
6. Como verificar se um arquivo existe?
7. Compara dois arquivos textos
8. Convertendo nomes longos para nomes
curtos
9. Copia ou move arquivos usando a API do
Windows
10. Copiando arquivos
11. Copiando arquivos de diretório para diretório
12. Copiando arquivos usando o Shell do
Windows
13. Copiando arquivos via programação
14. Copiando um arquivo com um gauge
15. Copiar arquivos usando curingas (*.*)
16. Criando diretório
17. Criando um arquivo de texto
18. Criar sub-diretório no diretório do EXE
19. Cuidado quando gravar arquivos binarios
20. Definindo Atributo de um arquivo
21. Deletando um arquivo
22. Deletando um Diretório
23. Deletar um diretório inteiro de uma vez
24. Encriptar/Desencriptar arquivos
25. Enviando um arquivo para a lixeira
26. Excluir arquivos usando curingas (*.*)
27. Exibindo as propriedades do arquivo
28. Exibindo ou compararando data de arquivos
29. Lendo e gravando arquivos de texto
30. Listar Arquivos de um Diretório
31. Localizar Arquivos do Windows
32. Mostrando a lista de último acesso dos
arquivos aberto ultimamente
33. Nomes dos arquivos que estão sendo
executados:
34. Pega o path de um arquivo arrastado do
explorer
35. Pegando a data de um arquivo
36. Procurando um arquivo em todo o HD
37. Procurar arquivos
38. Programar meu aplicativo para abrir arquivos
a partir do Windows Explorer
39. Retorna a hora da criação de um diretório
40. Retorna o último acesso de um arquivo
41. Tamanho de um Diretorio
42. Verifica tipo de arquivo
43. Verificando atributo do arquivo
Banco de Dados
1. 10 Passos para fazer o Interbase
2. 20 motivos alguns motivos para você adotar
o InterBase em sua empresa
3. Abrir tableas paradox protegidas por senha
4. Acessando o banco de dados Oracle a partir
do Delphi
5. Alterando Idapi32.Cfg Via Programa
6. Alterando o NetDir via programação:
7. Apagando todos os registros da tabela
8. Armazanando sons, vídeos em bancos de
dados
9. Armazenado num Blop
10. Backup e Restauração
11. BDE em 1 disquete
12. Bloqueia uma Tabela paradox
13. Código de Erros do BDE
14. Colocando uma barra de progresso para o
batchmove
15. Colocar senha geral em um banco de dados
Access
16. Como acessar pelo Delphi, tabelas no Acess
17. Como alterar a coluna Description do
IBConsole
18. Como alterar o driver de acesso do access no
bde automaticamente
19. Como converter DBF para Paradox e Acess
paar Paradox
20. Como criar um arquivo de Backup muito feio
mais eficiente
21. Como fazer para o sistema nao pedir o Login
(Password) Banco de Dados
22. Como importar dados de um arquivo texto
para uma Tabela
23. Como pegar o diretorio de uma ALIAS
24. Como Reindexar um Banco M$Access 2000?
25. Configurar o Delphi para acessar tabelas do
Acess
26. Convertendo valores de Campos
27. Corrigir Erros de campo AutoIncremento
28. Criado Alias via programação
29. Criando Alias de Banco de Dados no código
30. Criando drivers ODBC através do Delphi
31. Criando um campo lookup em tempo de
execução
32. Criando uma base de dados MS Access pelo
Delphi
33. Definir a quantidade de registros a ser
impressa
34. Desvendando a programação “Client/Server”
35. Escrever para um DB Access usando ADO /
SQL
36. Evitando o erro de Key Violation
37. Evitando Perdas de Dados
38. Exibindo caixa de diálogo personalizada de
solicitação de senha do banco dados
39. Exibindo corretamente o conteúdo dos
campos boolean
40. Exibir a caixa de solicitação de senha do
banco de dados
41. Exportando ADO tables em vários formatos
Veja a descrição:
TScreenSaver
Por Jon Baker. O componente permite a você criar
protetores de tela para Windows 95 & Nt.* Somente
coloque o componente no seu Form e irá pegar todos os
parametros, como /p, /s, /c, /a e mostrar a visualização,
configuração, password, etc.
Ass.
Marcus
002 - Linkar um OBJ ao executavel
Primeiro voce deve “linkar” o OBJ ao seu executavel. No
Delphi , isto eh feito com a diretriz de compilacao $L.
Fica, na sua unit principal, assim:
{$L MyOBject.OBJ}
Incluindo as chaves.
Logo depois, voce deve declarar a funcao contida em
MyObject.OBJ da forma usual. Voce precisara conhecer
os parametros usados pela mesma, bem como o tipo e a
ordem em que sao passados. Voce deve incluir tambem
a diretriz PASCAL ou CDECL. Sugiro tentar primeiro
com PASCAL. Ficaria assim (na secao implementation:
function (Parametro1 : TipoDoParametro1,
Parametro2 : TipoDoParametro2):
TipoDoRetorno; pascal;
se nao der certo, tente:
function (Parametro1 : TipoDoParametro1,
Parametro2 : TipoDoParametro2):
TipoDoRetorno; cdecl;
caso nao seja uma funcao e sim uma procedure, tente
procedure (Parametro1 : TipoDoParametro1,
Parametro2 : TipoDoParametro2);
pascal;
ou
procedure (Parametro1 : TipoDoParametro1,
Parametro2 : TipoDoParametro2);
cdecl;
Se voce nao sabe quais os parametros usados pela
funcao/procedure, uma solucao seria linkar o seu OBJ
num programa qualquer e disassembla-lo. Ai pelo
menos voce sabera a quantidade e o tipo de cada
parametro. De qualquer forma, para saber para que
serve cada um, tera que ser na tentativa e erro…a nao
ser que voce tambem tenha paciencia para analisar o
codigo disassemblado.
OBS: Se o seu OBJ nao estiver num formato
reconhecivel pelo LINK do Delphi (um formato similar ao
COFF), voce pode tentar outros Linkers, e criar uma dll.
Existem varios linkers gratuitos, que reconhecem varios
formatos (exemplos, sao lcclnk, djlnk, walk2lnk e o
proprio linker da microsoft…tambem gratuito).
003 - Alterar o LOCAL SHARE via
programação
No WIN 95 você pode alterar diretamente a chave do
registro que seta esta opção. Fica em
HKEY_LOCAL_MACHINE > Software > … LOCAL
SHARE “TRUE” (Pesquise com o regedit). Já no WIN
3.xxx eu também gostaria de saber.
Contribuição
O Willian Vieira dos Santos enviou esse procedimento
que serve para realizar esses tipos de modificações
Procedure
ModifyBDE(Path,Chave,Valor:String);
var ParamList: TParamList;
Lista:TStringList;
cfgMode:TConfigMode;
i:Integer;
begin
Lista:=TStringList.Create;
//Recupera Lista de Configurações
Session.GetConfigParams(Path,”,Lista);
//Verifica na lista, onde a chave
modificada se encontra
For i:=0 to Lista.Count-1 do
If
Pos(UpperCase(Chave),UpperCase(Lista[i]))
<>0 Then
Lista[i]:=UpperCase(Chave)+’=’+Valor;
//Salva o atual modo de configuração da
variável de sessão
cfgMode:=Session.ConfigMode;
//Coloca em modo de alteração
Session.ConfigMode:=cmPersistent;
//Cria lista de parâmetros
ParamList := TParamList.Create(Lista);
//Chama API do BDE para modificar as
configurações
Check(DbiCfgModifyRecord(nil,
PChar(Path), ParamList.FieldCount,
PFLDDesc(ParamList.FieldDescs),
ParamList.Buffer));
//Recupera o modo de configuração da
variável de sessão
Session.ConfigMode:=cfgMode;
//Salva as configurações da sessão
Session.SaveConfigFile;
ParamList.Free;
Lista.Free;
End;
procedure TForm1.BitBtn1Click(Sender:
TObject);
var
Linha:integer;
Tamanho:integer;
Coluna:integer;
begin
Printer.Orientation := poLandscape;
Printer.BeginDoc;
Printer.Canvas.Pen.Width := 5;
Printer.Canvas.Font.Name := ‘Times New
Roman’;
Printer.Canvas.Font.Size := 10;
Linha := 20;
Coluna:= 20;
Tamanho := Printer.Canvas.TextWidth(‘a’);
Table1.First;
while not Table1.Eof do
begin
if Linha = 20 then
begin
Coluna := 20;
Printer.Canvas.TextOut(0,Linha,‘Relação de
Clientes’);
Linha := Linha -
Printer.Canvas.Font.Height + 5 ;
Printer.Canvas.TextOut(Coluna,Linha,‘Cod’)
;
Coluna:= Coluna + (Tamanho * 5 );
Printer.Canvas.TextOut(Coluna,Linha,‘Nome’
);
Coluna:= Coluna + (Tamanho * 30);
Printer.Canvas.TextOut(Coluna,Linha,‘Ender
eço’);
Coluna:= Coluna + (Tamanho * 30);
Linha := Linha -
Printer.Canvas.Font.Height + 5 ;
end;
Coluna := 20 ;
Printer.Canvas.TextOut(Coluna,Linha,Table1
.FieldByName(‘Codigo’).AsString);
Coluna:= Coluna + (Tamanho * 5 );
Printer.Canvas.TextOut(Coluna,Linha,Table1
.FieldByName(‘Nome’).AsString);
Coluna:= Coluna + (Tamanho * 30);
Printer.Canvas.TextOut(Coluna,Linha,Table1
.FieldByName(‘End’).AsString);
Coluna:= Coluna + (Tamanho * 30);
Linha := Linha -
Printer.Canvas.Font.Height + 5 ;
Table1.Next;
if Linha > Printer.PageHeight-20 then
Begin
Printer.NewPage;
Linha := 20;
end;
end;
Printer.EndDoc;
end;
012 - Imprimir Direto Para
Impressora
procedure TForm1.Button1Click(Sender:
TObject);
var
F : TextFile;
i : integer;
begin
AssignFile(F,‘LPT1’);
Rewrite(F);
i := 0;
Writeln(F,‘Teste de impressao - Linha 0’);
Writeln(F,‘Teste de impressao - Linha 1’);
Writeln(F,#27#15+‘Teste de Impressão -
Linha 2’);
Writeln(F,‘Teste de impressao - Linha 3’);
Writeln(F,#27#18+‘Teste de Impressão -
Linha 4’);
Writeln(F,‘Teste de impressao - Linha 5’);
Writeln(F,#12); // Ejeta a página
CloseFile(F);
end;
013 - Definir o tamanho do papel
em TPrinter
Esta procedure configura o tamanho do papel em Run-
Time para ser utilizado com o objeto TPrinter; Esta
procedure deve ser chamada antes de aplicar o método
Printer.BeginDoc.
procedure TForm1.SetPrinterPage(Width,
Height : LongInt);
var
Device : array[0..255] of char;
Driver : array[0..255] of char;
Port : array[0..255] of char;
hDMode : THandle;
PDMode : PDEVMODE;
begin
Printer.GetPrinter(Device, Driver, Port,
hDMode);
If hDMode <> 0 then
begin
pDMode := GlobalLock( hDMode );
If pDMode <> nil then
begin
pDMode^.dmPaperSize := DMPAPER_USER;
pDMode^.dmPaperWidth := Width;
pDMode^.dmPaperLength := Height;
pDMode^.dmFields := pDMode^.dmFields or
DM_PAPERSIZE;
GlobalUnlock( hDMode );
end;
end;
end;
014 - Como Criar Forms Em Tempo
de Execução
Para você economizar memória, pode-se criar os forms
de sua aplicação somente no momento da execução. Na
criação do Form você define se ele é MODAL ou NÃO
MODAL. Para Isso observe os seguintes códigos:
MODAL - Mostra form em modo exclusivo
procedure TForm1.Button1Click(Sender:
TObject);
begin
Application.CreateForm(TForm2, Form2);
{Carrega form na memória}
Form2.ShowModal;{Mostra form em modo
exclusivo}
Form2.Free; {Libera Memória}
end;
NÃO MODAL - Mostra form em modo não exclusivo
procedure TForm1.Button1Click(Sender:
TObject);
begin
Application.CreateForm(TForm2, Form2);
{Carrega form na memória}
Form2.ShowModal;{Mostra form em modo
exclusivo}
end;
No evento OnClose do Form2 coloque o seguinte
código.
procedure TForm2.FormClose (Sender:
Tobject; var Action : TCloseAction);
begin
Action:= caFree;
end;
Aliado a este código, você deve alterar no delphi, no
menu Options, opção Project. Mudando os forms a
serem criados dinamicamente da coluna Auto-Create
Forms para Avaliable Forms.
015 - Adaptando para resoluções
de video diferentes?
Sempre que procurei algo sobre esse tema, ia para no
Tip da Borland #2861, que é a mesma informação do
arquivo de help da Loyd’s. Esse texto tambem aparece
nos bancos de dados da Q&A. Eu suponho que essa
seja a informação definitiva. Encontreiuma informação
que não foi mencionada aqui. Pela lista de correiros do
Delphi-Talk havia mensagens de Brien King e
MichaelNovak que discutiam esse assunto.
***
LOYD´S TIPS:
Resolução de Vídeo:
Quando criamos formulários, ãs vezes é útil escrever um
código para que a tela e todos os seus objetos sejam
mostrados nomesmo tamanho, não importando qual a
resolução da tela. Aqui esta um código que mostra como
isso é feito:
Implementation
const
ScreenWidth: LongInt = 800; {I designed my
form in 800x600 mode.}
ScreenHeight: LongInt = 600;
{$R *.DFM}
procedure TForm1.FormCreate (Sender:
Tobject);
begin
scaled := true;
if (screen.width <> ScreenWidth) then
begin
height := longint(height) *
longint(screen.height) DIV ScreenHeight;
width := longint(width) *
longint(screen.width) DIV ScreenWidth;
scaleBy(screen.width, ScreenWidth);
end;
end;
Agora, você vai querer checar, se o tamanho dos
fontes(de letra) estão OK. Antes de trocar p tamanho do
fonte, você precisará ter
certeza de que o objeto realmente tem a propriedade
fonte pela checagem da RTTI. Isso pode ser feito assim:
USES typinfo; {Add this to your USES
statement.}
var
i:integer;
begin
for i := componentCount - 1 downto 0 do
with components[i] do
begin
if GetPropInfo(ClassInfo, ´font´) <> nil
then
font.size := (NewFormWidth DIV
OldFormWidth) * font.size;
end;
end;
{Esta é a maneira longa de fazer a mesma coisa}
var
i:integer;
p:PPropInfo;
begin
for i := componentCount - 1 downto 0 do
with components [i] do
begin
p := GetPropInfo (ClassInfo, ´font´);
if assigned (p) then
font.size := (NewFormWidth DIV
OldFormWidth) * font.size;
end;
end;
Atenção: Nem todos os objetos tem a propriedade
FONT. Isso deve ser o suficiente para você começar.
Atenção: A seguir, algumas dicas para ter em mente
quando representar aplicações Delphi (formulários) em
diferentes resoluçõesde Tela:
* Decida antecipadamente, na etapa de criação do
formulário, se ele será escalável ou não. A vantagem de
um não escalável é que nada muda em tempo de
execução. A desvantagem é equivalente (seu formulário
pode ser muito pequeno ou grande para alguns
sistemas se nào for usada escala).
* Se você não for usar formulário escalável, configure o
set scaled to False.
* Ou então, configure a propriedade scaled do formulário
para True.
* Configure a propriedade AutoScroll para False.
AutoScroll = True quer dizer “não mexa no tamanho do
frame do formulário em tempo de execução”, o que não
parece bom quando o conteúdo do formulário muda de
tamanho.
* Configure a fonte do formulário para uma True Type
escalável, como a Arial MS. San Serif é uma boa
alternativa, mas lembre que ainda é uma fonte
bitmapped. Só a Arial dará uma fonte dentro de um pixel
da altura desejada.ATENÇÃO: Se a fonte usada em
uma aplicação não estiver instalada no computador, o
Windows selecionará uma fonte alternativa da mesma
família para utilizar. O tamanho dessa fonte pode não
corresponder ao da fonte original, podendo causar
problemas.
* Configure a propriedade position do formulário para
uma opção diferente de poDesigned. poDesigneddeixa o
formulário onde você o deixou ( no design Time), o que
sempre termina fora da margem, à esquerda da minha
tela 1280 x 1024 - e completamente fora da tela 640 x
480.
* Não amontoe controles no formulário - deixe pelo
menos 4 pixels entre else, para que uma mudança de
um pixel nas margens (devido a apresentação em
escala) não mostre controles sobrepostos.
* Para labels de uma linha alinhadas ã esquerda ou à
direita, configure o AutoSize para True. Para outras
formas de alinhamento configure o AutoSize para False.
* Tenha certeza de que há espaço em branco suficiente
num componente de labels para alterações no tamanho
da fonte – um espaço de 25% do comprimento da linha
de caracteres mostrada é um pouco a mais do que se
precisa, mas é mais seguro. (Você vai precisar de um
espaço equivalente a 30% de espansão para string
labels se você pretende traduzir sua aplicação para
outra linguagem). Se o Autosize estiver em False, tenha
certeza de que realmente configurou o tamanho do label
corretamente. Se o Autosize estiver em True, esteja
certo de que há espaço suficiente para que o label se
amplie.
* Em labels de múltiplas linhas ou de termos ocultos,
deixe pelo menos uma linha em branco na base. Isso vai
ser necessário para incluir o que estiver sobrando
quando o texto for oculto de maneira diferente, pela
mudança do tamanho da fonte com a escala. Não
assuma isso porque está usando fontes grandes. Você
não tem que deixar sobra de texto - as fontes (grandes)
de outros usuários podem ser maiores que as suas!
* Tenha cuidado quando abrir um projeto em IDEs com
resoluções diferentes. Assim que o formulário for aberto,
sua propriedade Pixel per Inch será moditificada, e
gravada para o DFM se você salvar o projeto. É melhor
testar a aplicação rodando sozinho, e editar o formulário
em apenas uma resolução. Editar em várias resoluções
e tamanhos de fonte provoca problemas de fluxo e
tamanho dos componentes.
*Falando em fluxo de componentes, não represente o
formulário em escala muitas vezes, quando estiver
sendo criado ou quando tiver sendo executado. Cada
escala introduz erros de roundoff que se acumulam
muito rapidamente, uma vez que as coordenadas são
rigorosamente interias. Quando valores fracionários
forem retirados das origens e tamanhos do controle com
cada sucessiva representação em escala, os conttroles
parecerão deslizar para noroeste e ficar menores. Se
você quer deixar seus usuários representarem o
formulários em escala quantas vezes quiserem, comece
com um formulário recentemente criado para que erros
de escala não se acumulem.
* Definitivamente, não mexa na propriedade Pixel pre
Inch do formulário.
* Em geral, não é necessário criar formulários em uma
resolução específica, mas é essencial que você os
revise em 640 x 480 com fontes pequenas e/ou grandes,
e em alta resolução com fontes pequenas e/ou grandes
antes de liberar suas aplicações. Isso deverser parte de
sua lista de conferência para testar a compatibilidade do
sistema regularmente.
* Preste bastante atenção em todos os componentes
que são basicamamente TMemo de uma linha - com
oTDBLookupCombo. O controle de edição (multi-linhas)
do Windows sempre mostra apenas linhas inteiras de
texto. Se o controle for muito curto para sua fonte, um
TMemo não mostrará coisa alguma, e um TEdit
mostrará um pedaço do texto. É melhor fazer esses
componentes um pouco maiores do que deixá-los um
pixel menores e não aparecer nada do texto.
* Tenha em mente que toda representação em escala é
proporcional à diferença da altura da fonte entre o modo
de execução e o modo de desenho, NÃO à resolução ou
ao tamanho do monitor. Lembre também que as origens
dos seus controles serão alteradas quando o formulário
for representado em escala. Você não pode aumentar
componentes muito bem sem também movê-los um
pouco, novamente.
Function MidiaPresente(MediaPlayer:
TMediaPlayer): Boolean;
var
Params: MCI_STATUS_PARMS;
S: array [0..255] of char;
r: Integer;
begin
//verifica se existe um cd inserido
Params.dwItem:= MCI_STATUS_MEDIA_PRESENT;
r:= MCISendCommand(MediaPlayer.DeviceID,
MCI_STATUS, MCI_STATUS_ITEM,
Integer(Addr(Params)));
if r <> 0 then
begin
MCIGetErrorString(r, S, SizeOf(S));
ShowMessage(‘Erro: ‘ + StrPas(S));
end
else
Result:= Params.dwReturn = 1;
end;
029 - Tradução de Mensagens
Depois de algum tempo pesquisando uma forma de
fazer aparecer as mensagens em português, consegui
uma solução muito fácil de implementar no ambientede
programação do Delphi 3.
CHEGA DE YES/NO !!!
messagedlg(‘Confirma ? mtConfirmation, [mbYes,
mbNo], 0);
Aí vai:
1 - No diretório DELPHI3\LIB, copie o arquivo consts.dcu
para consts.old;
2 - Inicie o Delphi e crie um nova Unit;
3 - Insira nesta, o arquivo consts.int do diretório
DELPHI3\DOC E faça as devidas alterações nas
mensagens que desejares alterar e nas partes
duplicadas da Unit como “implement” e etc, também
deixe o cabeçalho como Unit Consts.
4 - Salve esta nova Unit no diretório DELPHI\LIB e
pronto todas as mensagens alteradas por você estarão
aplicadas nos seus próximos programas sem uma linha
de programa e da forma que você quiser.
TForm1.Create;
Begin
Application.OnException:=MostraErro;
end;
032 - Capturando conteúdo do
desktop
procedure TForm1.FormResize(Sender:
TObject);
var
R : TRect;
DC : HDc;
Canv : TCanvas;
begin
R := Rect( 0, 0, Screen.Width,
Screen.Height );
DC := GetWindowDC( GetDeskTopWindow );
Canv := TCanvas.Create;
Canv.Handle := DC;
Canvas.CopyRect( R, Canv, R );
ReleaseDC( GetDeskTopWindow, DC );
end;
033 - Obtendo número do registro
atual
Function Recno(Dataset: TDataset):
Longint;
var
CursorProps: CurProps;
RecordProps: RECProps;
begin
{ Return 0 if dataset is not Paradox or
dBASE }
Result := 0;
with Dataset do
begin
if State = dsInactive then
DBError(SDataSetClosed);
Check(DbiGetCursorProps(Handle,
CursorProps));
UpdateCursorPos;
try
Check(DbiGetRecord(Handle, dbiNOLOCK, nil,
@RecordProps));
case CursorProps.iSeqNums of
0: Result := RecordProps.iPhyRecNum; {
dBASE }
1: Result := RecordProps.iSeqNum; {
Paradox }
end;
except
on EDBEngineError do
Result := 0;
end;
end;
end;
034 - Enviando um arquivo para a
lixeira
uses ShellAPI;
Function DeleteFileWithUndo(sFileName :
string ) : boolean;
var
fos : TSHFileOpStruct;
Begin
FillChar( fos, SizeOf( fos ), 0 );
With fos do
begin
wFunc := FO_DELETE;
pFrom := PChar( sFileName );
fFlags := FOF_ALLOWUNDO
or FOF_NOCONFIRMATION
or FOF_SILENT;
end;
Result := ( 0 = ShFileOperation( fos ) );
end;
035 - Carregar um cursor animado
(*.ani)
const
cnCursorID1 = 1;
begin
Screen.Cursors[ cnCursorID1 ] :=
LoadCursorFromFile(‘c:\win95\cursors\caval
o.ani’ );
Cursor := cnCursorID1;
end;
036 - Modificando a posição do
cursor em um Memo
Modificando a posição:
ActiveControl:=Memo1;
MemoCursorTo(Memo1,2,3);
Obtendo a Posição:
GetMemoLineCol(Memo1,Linha,Coluna);
037 - Traduzindo a mensagem
“Delete Record ?”
Quando clicamos sobre o botão de deleção no
DBNavigator (o do sinal de menos) surge uma box com
a mensagem “Delete Record?” com botões Ok e Cancel.
Para fazer aparecer a mensagem em português deverá
selecionar o componente Table e mudar a propriedade
ConfirmDelete para False e no evento da tabela
BeforeDelete colocar o seguinte:
procedure
TForm1.Table1BeforeDelete(DataSet:TDataSet
);
begin
if MessageDlg(‘Eliminar o
Registro?’,mtConfirmation,[mbYes,mbNo],0)
<>mrYes then Abort;
end;
038 - Pegando o Nome do usuário e
a Empresa do Windows
Uses Registry;
Procedure GetUserCompany;
var
reg: TRegIniFile;
begin
reg :=
TRegIniFile.create(‘SOFTWARE\MICROSOFT\MS
SETUP (ACME)');
Edit1.Text := reg.ReadString(‘USER
INFO’,‘DefName’,”);
Edit2.Text := reg.ReadString(‘USER
INFO’,‘DefCompany’,”);
reg.free;
end;
039 - Escrevendo um Texto na
Diagonal usando o Canvas
procedure TForm1.Button1Click(Sender:
TObject);
var
lf : TLogFont;
tf : TFont;
begin
with Form1.Canvas do
begin
Font.Name := ‘Arial’;
Font.Size := 24;
tf := TFont.Create;
tf.Assign(Font);
GetObject(tf.Handle, sizeof(lf), @lf);
lf.lfEscapement := 450;
lf.lfOrientation := 450;
tf.Handle := CreateFontIndirect(lf);
Font.Assign(tf);
tf.Free;
TextOut(20, Height div 2, ‘Texto
Diagonal!’);
end;
end;
040 - Fundo do texto transparente
procedure TForm1.Button1Click(Sender:
TObject);
var
OldBkMode : integer;
begin
with Form1.Canvas do begin
Brush.Color := clRed;
FillRect(Rect(0, 0, 100, 100));
Brush.Color := clBlue;
TextOut(10, 20, ‘Não é Transparente!’);
OldBkMode := SetBkMode(Handle,
TRANSPARENT);
TextOut(10, 50, ‘É Transparente!’);
SetBkMode(Handle, OldBkMode);
end;
end;
041 - Formatação de Casas
Decimais
procedure TForm1.Button1Click(Sender:
TObject);
var
num : integer;
begin
num:=12450;
Edit1.text:=formatfloat(‘###,###,##0.00’,
num)
end;
042 - Escondendo/Mostrando o
botão Iniciar
procedure EscondeIniciar(Visible:Boolean);
Var taskbarhandle,
buttonhandle : HWND;
begin
taskbarhandle :=
FindWindow(‘Shell_TrayWnd’, nil);
buttonhandle := GetWindow(taskbarhandle,
GW_CHILD);
If Visible=True Then Begin
ShowWindow(buttonhandle, SW_RESTORE);
{mostra o botão}
End Else Begin
ShowWindow(buttonhandle, SW_HIDE);
{esconde o botão}
end;
end;
043 - Esconde/Mostra a Barra de
Tarefas
procedure EscondeTaskBar(Visible:
Boolean);
var wndHandle : THandle;
wndClass : array[0..50] of Char;
begin
StrPCopy(@wndClass[0],‘Shell_TrayWnd’);
wndHandle := FindWindow(@wndClass[0],
nil);
If Visible=True Then Begin
ShowWindow(wndHandle, SW_RESTORE); {Mostra
a barra de tarefas}
End Else Begin
ShowWindow(wndHandle, SW_HIDE); {Esconde a
barra de tarefas}
End;
end;
044 - Detectando o Numero Serial
do HD
Function SerialNum(FDrive:String) :String;
Var
Serial:DWord;
DirLen,Flags: DWord;
DLabel : Array[0..11] of Char;
begin
Try
GetVolumeInformation(PChar(FDrive+’:'),dLa
bel,12,@Serial,DirLen,Flags,nil,0);
Result := IntToHex(Serial,8);
Except Result :=”;
end;
end;
045 - Como Limpar Todos os Edit’s
de um Form de uma só vez?
Procedure LimpaEdit;
var
i : Integer;
begin
for i := 0 to ComponentCount -1 do
if Components[i] is TEdit then
begin
TEdit(Components[i]).Text := ”;
end;
end;
Contribuição de Fabio SVB:
procedure LimpaEdit (Form: TForm);
var
i : Integer;
begin
for i := 0 to Form.ComponentCount - 1 do
if Form.Components[i] is TCustomEdit then
(Form.Components[i] as TCustomEdit).Clear;
end;
// assim limpara todos os Edits, Memos, MaskEdits, etc…
//Valeu!!
046 - Marcando um pedaço do
código
As Vezes quando vc tem uma unidade com muitas
linhas de código (umas 1000 por exemplo), fica difícil
achar o bloco de código que você quer; e para facilitar
isso o Delphi tem um tipo de “bookmark” de código.
Para colocar o bookmark, posicione no lugar onde você
quer marcar e pressione CTRL+SHIFT+ o número do
bookmark que você vai criar de (0..9), por exemplo
CTRL+SHIFT+0.
Para retornar ao bloco marcado você deve pressionar
CTRL+ o número do bookmark. Por exemplo CTRL+1.
Ps: A opção Editor FindTextAtCursor deve estar
marcada, ou estas teclas não irão funcionar.
047 - Alterar o papel de parede 1
program wallpapr;
procedure SetWallpaper(sWallpaperBMPPath :
String; bTile : boolean );
var
reg : TRegIniFile;
begin
// Mudando o Registro HKEY_CURRENT_USER
// Control Panel\Desktop
// TileWallpaper (REG_SZ)
// Wallpaper (REG_SZ)
reg := TRegIniFile.Create(‘Control
Panel\Desktop’ );
with reg do begin
WriteString( ”,
‘Wallpaper’,sWallpaperBMPPath );
if( bTile )then begin
WriteString( ”, ‘TileWallpaper’, ‘1’ );
end else begin
WriteString( ”, ‘TileWallpaper’, ‘0’ );
end;
end;
reg.Free;
// Mostrar que o parametro do sistema foi
alterado
SystemParametersInfo(
SPI_SETDESKWALLPAPER,0, Nil,
SPIF_SENDWININICHANGE );
end;
begin
SetWallpaper( ‘c:\winnt\winnt.bmp’, False
);
end.
048 - Alterando cor de linha de um
DBGrid
Coloque a propriedade defaultdrawdata do dbgrid em
FALSE
No evento onDrawColumnCell do seu grid coloque o
seguinte:
procedure
TForm1.DBGrid1DrawColumnCell(Sender:
TObject;
const
Rect: TRect; DataCol: Integer; Column:
TColumn;
State: TGridDrawState);
begin
If table1PRAZO.Value > DATE then //
condição
Dbgrid1.Canvas.Font.Color:= clFuchsia; //
coloque aqui a cor desejada
Dbgrid1.DefaultDrawDataCell(Rect,
dbgrid1.columns[datacol].field, State);
end;
049 - Diretório de instalação do
windows
function PegaSysDir: string;
var
MeuBuffer: Array [1..128] of Char;
retorno: Integer;
Begin
retorno:=GetSystemDirectory(@MeuBuffer,128
);
if (retorno>128) OR (retorno=0) then
PegaSysDir:=”
else
PegaSysDir:=StrPas(@MeuBuffer);
End; {prc}
050 - Exclusividade para o
programa
Gostaria de saber como fazer para que, ao iniciar minha
aplicacao Delphi, eu ” desabilite ” o shell do Windows
(Explorer). Ou seja, o que eu preciso e’ de uma forma de
fazer com que apos a minha aplicacao seja iniciada, o
usuario nao tenha como alternar entre programas,
acessar outros icones, etc
No System.ini você tem uma configuração como esta :
Shell=Explorer.exe
Basta trocar por
Shell=Myprog.exe
Ou usando delphi
procedure Tform1.ChangeShell(String
programa);
var
ArquivoIni : Tinifile;
begin
try
ArquivoIni :=
Tinifile.Create(‘System.ini’);
ArquivIni.WriteSection(‘Config’,‘Shell’,‘M
yprog.exe’);
fynally
ArquivoIni.Destroy;
end;
end;
051 - Substituindo TAB pelo
ENTER
procedure TF_Padrao.FormKeyPress(Sender:
TObject; var Key: Char);
begin
if Key = #13 then
if not (ActiveControl is TDBGrid) then
begin
Key := #0;
Perform(WM_NEXTDLGCTL, 0, 0);
end
else if (ActiveControl is TDBGrid) then
with TDBGrid(ActiveControl) do
if selectedindex < (fieldcount -1) then
selectedindex := selectedindex +1
else
selectedindex := 0;
end;
procedure
TForm1.btnFormatDiskClick(Sender:
TObject);
var
retCode: LongInt;
begin
retCode:= SHFormatDrive(Handle, 0,
SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT);
if retCode < 0 then ShowMessage(‘Could
not format drive’);
end;
063 - Como detectar as teclas de
“seta”
Use os eventos KeyDown ou KeyUp e teste se Key =
VK_LEFT ou VK_RIGHT, etc.
064 - Caps Lock e Num Lock
procedure TMyForm.Button1Click(Sender:
TObject);
Var
KeyState : TKeyboardState;
begin
GetKeyboardState(KeyState);
if (KeyState[VK_NUMLOCK] = 0) then
KeyState[VK_NUMLOCK] := 1
else KeyState[VK_NUMLOCK] := 0;
SetKeyboardState(KeyState);
End;
Para a tecla Caps Lock basta trocar VK_NUMLOCK por
VK_CAPITAL.
065 - BDE em 1 disquete
Depois que apanhei bastente do BDE, recorri a lista e
ninguem consegui me ajudar … consegui resolver o
problema. E como acredito que outras pessoas tenham
o mesmo problema, resolvi colocar essa dica na lista.
Por favor, se alguem tiver algo a acresentar ou mesmo
corrigir, sinta-se a vontade para compartilhar conosco.
Arquivos Exenciais para o BDE:
EUROPE.BLL
USA.BLL
IDR20009.DLL
IDAPI32.DLL
BLW32.DLL
IDAPI32.CFG <– esse arquivo pode ter qualquer outro
nome, desde que seja configurado no registro.
Drivers de Banco de Dados:
IDPDX32.DLL <– Driver Paradox
IDASCI32.DLL <– Driver ASCII
IDDBAS32.DLL <– Driver DBase
IDODBC32.DLL <– Driver ODBC
O BDE precisa de pelo menos um Driver de Banco de
Dados para funcionar. Esses acima sao apenas alguns,
existem varios outros.
O BDE 4.51 + Driver Paradox compactados com o
Algoritimo ZIP, ocuparam aproximadamente 650 Kb.
Entradas no Registro do Win95:
HKEY_LOCAL_MACHINE
SOFTWARE\Borland\Database Engine
DLLPATH -> localizacao do BDE (Unidade+Caminho
Completo)
CONFIGFILE01 -> localizacao do arquivo de
configuracao (Unidade+Caminho
Completo+Nome do Arquivo)
SOFTWARE\Borland\BLW32
BLAPIPATH -> localizacao do BDE (Unidade+Caminho
Completo)
LOCALE_LIB1 -> localizacao do arquivo USA.BLL
(Unidade+Caminho
Completo+USA.BLL)
LOCALE_LIB2 -> localizacao do arquivo EUROPE.BLL
(Unidade+Caminho
Completo+EUROPE.BLL)
Segue um pequeno exemplo de como registrar o BDE
no Registro do Win95:
begin
Registry.RootKey := HKEY_LOCAL_MACHINE;
Registry.CreateKey(‘SOFTWARE\Borland\Datab
ase Engine’);
Registry.OpenKey(‘SOFTWARE\Borland\Databas
e Engine’, False);
Registry.WriteString(‘DLLPATH’,
‘C:\ARQUIVOS DE PROGRAMAS\BDE');
Registry.WriteString(‘CONFIGFILE1’,
‘C:\ARQUIVOS DE
PROGRAMAS\BDE\IDAPI32.CFG’);
Registry.OpenKey(‘', False);
Registry.CreateKey(‘SOFTWARE\Borland\BLW32
’);
Registry.OpenKey(‘SOFTWARE\Borland\BLW32’,
False);
Registry.WriteString(‘BLAPIPATH’,
‘C:\ARQUIVOS DE PROGRAMAS\BDE');
Registry.WriteString(‘LOCALE_LIB1’,
‘C:\ARQUIVOS DE PROGRAMAS\BDE\USA.BLL’);
Registry.WriteString(‘LOCALE_LIB2’,
‘C:\ARQUIVOS DE
PROGRAMAS\BDE\EUROPE.BLL’);
end;
Table2.DatabaseName:=DirectoryListBox1.Dir
ectory; // Seleciona local de destino da
cópia
with Session1 do
begin
Active:=True;
GetTableNames(‘AliasName’,’*.*’,True,True,
Memo1.Lines); // Retorna o nome das
tabelas
end;
for I:= 0 to Memo1.Lines.Count - 1 do
begin
Table1.TableName:=Memo1.Lines[I]; //
Tabela origem
Table2.TableName:=Memo1.Lines[I]; //
Tabela destino
BatchMove1.Execute;
end;
end;
Para efetuar a restauração:
procedure
TFormRestaura.BitBtn1Click(Sender:
TObject);
var
I: Integer;
begin
Database1.Connected:=True;
Table2.DatabaseName:=DirectoryListBox1.Dir
ectory; // Origem da restauração
with Session1 do
begin
Active:=True;
GetTableNames(Table2.DatabaseName,’*.*’,Tr
ue,True,Memo1.Lines); // Retorna nomes das
tabelas
end;
for I:= 0 to Memo1.Lines.Count - 1 do
begin
Table1.TableName:=Memo1.Lines[I]; //
Tabela origem
Table2.TableName:=Memo1.Lines[I]; //
Tabela destino BatchMove1.Execute;
end;
end;
Procedure Acumula:TypeHora;
Var
Hora,minuto:Integer;
Begin
Hora:=Hora+StrToInt(Copy(DateTimeToStr(Tim
e()),1,2));
Minuto:=Minuto+StrToInt(Copy(DataTimeToStr
(Time()),4,5));
If Minuto >= 60 Then
Begin
Hora:=Hora+1;
Minuto:=0;
end;
Acumula[1]:=Hora;
Acumula[2]:=Minuto;
End;
Desta forma voce pode armazemar por exemplo o
numero de horas que uma pessoa trabalhou durante o
mes…
Espero ter ajudado…
[]‘s Odimar Tomazeli
078 - Para colocarmos um .bmp
como figura de fundo
Devemos utilizar o seguinte código:
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages,
Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender:Tobject);
procedure FormPaint(Sender:TObject);
private
grafico: TBitmap;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.
FormCreate(Sender:Tobject);
begin
grafico:= TBitmap.Create;
grafico.LoadFromFile
(‘C:\netsys\netsys.bmp’);
end;
procedure
TForm1.FormPaint(Sender:TObject);
begin
Form1.Canvas.Draw(0,0,grafico);
end;
end.
079 - Escondendo o Programa de
Ctrl+Alt+Del
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{Para ocultar um programa, deve-se
registrar este como um serviço do Windows.
Normalmente um serviço do Windows é
ativado quando com a inicialização do
sistema (Windows) e pemanece ativo até a
finalização deste. Este processo esconde o
programa da lista “Ctrl+Alt+Del”}
Const
Servico_Simples = 1;
Servico_Unregister = 1;
Function
RegisterServiceProcess(DwProcessID,
dwType: DWord): DWord; StdCall; External
‘KERNEL32.dll’;
procedure TForm1.FormCreate(Sender:
TObject);
begin
RegisterServiceProcess(GetCurrentProcessID
, Servico_Simples);
end;
procedure TForm1.FormDestroy(Sender:
TObject);
begin
RegisterServiceProcess(GetCurrentProcessID
, Servico_Unregister);
end;
end.
080 - Formulário Transparente
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender:
TObject);
begin
Brush.Style := BsClear;
end;
end.
081 - Mover Formulário em todas
as partes
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
private
{ Private declarations }
public
procedure WMNChitTest(var M:
TWMNchitTest);
message WM_NCHITTEST;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.WMNchitTest(var
M:TWMNChitTest);
begin
inherited;
if M.result = htclient then
M.result := htCaption;
end;
end.
082 - Filtrando registros com o
Quickreport (Delphi 2.0)
Você deve usar o evento OnFilter do componente
Quickreport. O mesmo possui a variável PrintRecord do
tipo Boolean. Para que o registro não seja impresso,
basta atribuir False a esta variável.
procedure TForm1.QuickReport1Filter(var
PrintRecord: Boolean);
begin
PrintRecord:= ( table1salario.value > 200
);
end;
083 - Como executar programas
externos
Winexec(‘Command.com /C
Teste.exe’,Tipo_de_Janela);
Tipo_de_Janela :
SW_SHOWNORMAL - Visualização normal da janela
SW_MAXIMIZE - Janela maximizada
SW_MINIMIZE - Janela minimizada
SW_HIDE - Escondido
084 - Alterando Idapi32.Cfg Via
Programa
Check(DbiAddAlias(Nil, PChar(‘ AliasName
‘), Nil, PChar(‘ AliasPath’), True));
Substitua AliasName pelo nome do alias que você quer
criar e em AliasPath pelo path dos arquivos de dados
que você quer no seu alias.
Inclua na cláusula “USES” as units BD e BDE.
procedure TForm1.AlterarClick(Sender:
TObject); var
AParams: TStringList;
caminho:string;
begin
caminho:=‘path=’ + edit1.text;
AParams := TStringList.Create;
try
Session.GetAliasParams(‘Teste’,AParams);
begin
AParams.Clear;
AParams.Add(caminho);
Session.ModifyAlias(‘Teste’,AParams);
Session.SaveConfigFile;
end;
finally
AParams.Free;
end;
end;
var
LineNum: longint;
CharsBeforeLine: longint;
begin
LineNum := SendMessage(Memo1.Handle,
EM_LINEFROMCHAR, Memo1.SelStart,0);
CharsBeforeLine :=
SendMessage(Memo1.Handle, EM_LINEINDEX,
LineNum, 0);
Label1.Caption := ‘Line ‘ +
IntToStr(LineNum +1);
Label2.Caption := ‘Position ‘ +
IntToStr((Memo1.SelStart -
CharsBeforeLine) + 1);
end;
087 - Pegar nome do usuário na
rede
function TForm1.usuario : string;
var
szNetName: Array[0..48] of Char;
iResult: DBIResult;
begin
iResult:= DBIGetNetUserName(szNetName);
if iResult <> DBIErr_None then
DBIError( iResult )
else
Result:= StrPas(szNetName);
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
if TemDiscoNoDrive(‘a’) then
ShowMessage(‘Tem disco no drive A:’)
else
ShowMessage(‘Não tem disco no drive A:’);
end;
096 - Como saber o estado das
teclas Num lock, Caps lock e Scroll
lock
Para saber o estado das teclas acima citadas, utilize a
função getkeystate em conjunto com o código das
teclas, ela retorna 0 se a tecla estiver OFF e 1 se a tecla
estiver ON, assim:
If getkeystate(vk_numlock) = 0 then // Num
lock está OFF
If getkeystate(vk_numlock) = 1 then // Num
lock está ON
If getkeystate(vk_scroll) = 0 then //
Scroll lock está OFF
If getkeystate(vk_scroll) = 1 then //
Scroll lock está ON
If getkeystate(vk_CAPITAL) = 0 then //
Caps lock está OFF
If getkeystate(vk_CAPITAL) = 1 then //
Caps lock está ON
097 - Como compartilhar uma pasta
de um outro micro e mapear com
uma letra
var
err : DWord;
PServer, PSenha, PLetra : PChar;
Begin
PServer := ‘\Caminho\Caminho’ + #0;
PLetra := ‘L:’;
PSenha := ”;
CASE ERR of
ERROR_ACCESS_DENIED : ShowMessage (
‘Acesso negado.’ );
ERROR_ALREADY_ASSIGNED : ShowMessage ( ‘A
letra do drive especificada já está
conectada.’ );
ERROR_BAD_DEV_TYPE : ShowMessage ( ‘O tipo
de dispositivo e o tipo de recurso não são
compatíveis.’ );
ERROR_BAD_DEVICE : ShowMessage ( ‘Letra
inválida.’ );
ERROR_BAD_NET_NAME : ShowMessage ( ‘Nome
do servidor não é válido ou não pode ser
localizado.’ );
ERROR_BAD_PROFILE : ShowMessage ( ‘Formato
incorreto de parâmetros.’ );
ERROR_CANNOT_OPEN_PROFILE : ShowMessage (
‘Conexão permanente não disponível.’ );
ERROR_DEVICE_ALREADY_REMEMBERED :
ShowMessage ( ‘Uma entrada para o
dispositivo especificado já está no perfil
do usuário.’ );
ERROR_EXTENDED_ERROR : ShowMessage ( ‘Erro
de rede.’ );
ERROR_INVALID_PASSWORD : ShowMessage (
‘Senha especificada inválida.’ );
ERROR_NO_NET_OR_BAD_PATH : ShowMessage (
‘A operação não foi concluída porque a
rede não foi inicializada ou caminho é
inválido.’ );
ERROR_NO_NETWORK : ShowMessage ( ‘A rede
não está presente.’ );
else if Err > 0 then
ShowMessage (IntToStr(Err));
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
GravaIni(1234,‘TESTE’,True);
end;
procedure TForm1.Button2Click(Sender:
TObject);
var
N: Integer;
T: String;
C: Boolean;
begin
LeIni(N,T,C);
Showmessage(IntToStr(N)+’ ‘+T);
end;
105 - Como extrair o tamanho de
um arquivo
function TamArquivo(Arquivo: string):
Integer;
begin
with TFileStream.Create(Arquivo,
fmOpenRead or fmShareExclusive) do
try
Result := Size;
finally
Free;
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
edit1.text:=
inttostr(TamArquivo(‘CAMINHO\NOMEDOARQUIVO
’));
end;
106 - Como alterar a data e a hora
do sistema
procedure TForm1.Button1Click(Sender:
TObject);
var
SystemTime : TSystemTime;
begin
With SystemTime do
begin
//Definindo o dia do sistema
wYear:= 1996;
wMonth:= 5;
wDay:= 10;
//Definindo a hora do sistema
wHour:= 20; //hora
wMinute:= 50; //minutos
wSecond:= 59; //segundos
end;
//Colocar a hora e data do sistema
SetLocalTime(SystemTime);
end;
107 - Como obrigar a digitação de
caracteres maiúsculos num campo
memo
procedure TForm1.Memo1KeyPress(Sender:
TObject; var Key: Char);
begin
Key:= Upcase(Key);
end;
108 - Como validar a entrada em
um TEdit
procedure Edit1KeyPress(Sender: TObject;
var Key: Char);
begin
If not( key in[‘0’..‘9’,#8] ) then
begin
beep;{somente delphi 2.0 ou >}
key:=#0;
end;
end;
109 - Como conectar uma unidade
de rede
procedure TForm1.Button1Click(Sender:
TObject);
var
NRW: TNetResource;
begin
with NRW do
begin
dwType := RESOURCETYPE_ANY;
lpLocalName := ‘G:’;
lpRemoteName := ‘\servidor\c’;
lpProvider := ”;
end;
WNetAddConnection2(NRW, ‘MyPassword’,
‘MyUserName’, CONNECT_UPDATE_PROFILE);
end;
110 - Inserindo um Combobox num
DBGrid
Siga o passo-a-passo abaixo :
1. insira um Datasource, um DBGrid e dois Table’s no
form
2. link o Table1 com Datasource1 e DBGrid1
3. defina um banco de dados, uma tabela e ative o
Table1
4. defina também para o Table2, mas use uma tabela
diferente
5. adicione todos os campos do Table1 através do Fields
Editor
6. mude a propriedade Visble para False do campo do
Combobox
7. dê um clique com o botão direito do mouse sobre o
Fields Editor e escolha New Field…
8. especifique os parametros para o novo campo
a) Name: <algum nome>
b) Type: <tipo do campo>
c) Size: <tamanho>
d) Field type: Lookup
e) Key Field: <campo que receberá o valor escolhido
no combobox&
f) DataSet: Table2
g) LookUpKeys: <campo listado no combo>
h) Result Field: <campo que será mostrado para o
usuário no Combobox>
9. Execute a aplicação.
111 - Definido o tamanho mínimo e
máximo de um formulário
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMGetMinMaxInfo(var MSG:
TMessage); message WM_GetMinMaxInfo;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Painel de Controle
HKEY_CLASSES_ROOT\CLSID\{21EC2020-3AEA-
1069-A2DD-08002B30309D}
(Padrão) -
InfoTip
Impressoras
HKEY_CLASSES_ROOT\CLSID\{2227A280-3AEA-
1069-A2DE-08002B30309D}
(Padrão)
InfoTip
Instalação
HKEY_LOCAL_MACHINE\Software\Microsoft\Wind
ows\CurrentVersion
RegisteredOrganization
RegisteredOwner
AutoExecução
HKEY_USERS.DEFAULT\Software\Microsoft\Wind
ows\CurrentVersion\Run
Outras Chaves
Meu Computador
HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-
1069-A2D8-08002B30309D}
Network Neighborhood
HKEY_CLASSES_ROOT\CLSID\{208D2C60-3AEA-
1069-A2D7-08002B30309D}
Caixa de Entrada
HKEY_CLASSES_ROOT\CLSID\{00020D75-0000-
0000-C000-000000000046}
Área de Trabalho
HKEY_CLASSES_ROOT\CLSID\{00021400-0000-
0000-C000-000000000046}
Atalho
HKEY_CLASSES_ROOT\CLSID\{00021401-0000-
0000-C000-000000000046}
Internet Explorer
HKEY_CLASSES_ROOT\CLSID\{25336920-03F9-
11CF-8FD0-00AA00686F13}
Documento MS WORD
HKEY_CLASSES_ROOT\CLSID\{00020900-0000-
0000-C000-000000000046}
Documento MS EXCEL
HKEY_CLASSES_ROOT\CLSID\{00024500-0000-
0000-C000-000000000046}
The MS NETWORK
HKEY_CLASSES_ROOT\CLSID\{00028B00-0000-
0000-C000-000000000046}
FONTES.
HKEY_CLASSES_ROOT\CLSID\{BD84B380-8CA2-
1069-A2DE-08000948F534}
113 - Posicionando o cursor numa
linha de um Memo ou RichEdit
Para posicionar o cursor em uma linha de um Memo ou
RichEdit, deve-se utilizar o seguinte:
With Memo1 do
SelStart := Perform(EM_LINEINDEX, Linha,
0);
114 - Como verificar se um arquivo
existe?
If
not(fileexists(‘c:\windows\nuvens.bmp’))
then Showmessage(‘Arquivo inexistente’);
115 - Evitando Perdas de Dados
Um dos problemas dos programadores Delphi é salvar
as informações fisicamente no disco rígido. Quando
estamos trabalhando com o programa as informações
ficam retidas no buffer, o que, em caso de queda de
energia ou até mesmo se o usuário fechar o Windows
com a aplicação aberta resulta na perda dos dados, que
foram processados na execução atual do sistema.
Para resolver o problema, basta acrescentar no evento
AfterPost de cada componente Table as linhas de código
que estão abaixo.
Na lista de Uses acrescente a unit DBIProcs.
Dessa forma, você não precisa temer perder os seus
dados por uma falha elétrica ou pela quebra do sistema
(como um erro GPF, por exemplo), após atualizar o
banco de dados.
implementation
uses DBIProcs;
{$R *.DFM}
procedure
TForm1.Table1AfterPost(DataSet: Dataset);
begin
DBISaveChanges(Table1.Handle);
end;
end.
116 - StrToIntDef
Quando utilizamos a função StrToInt e a string original
não é um inteiro, o programa gera uma exceção. Para
evitar isto, podemos utilizar a função StrToIntDef, que
insere um valor predeterminado (default) caso a string
não possa ser convertida em inteiro.
Veja o exemplo:
procedure TForm1.Button1Click(Sender:
TObject);
var
NumberString: string;
Number: Integer;
begin
NumberString := Edit1.Text;
Number := StrToIntDef(NumberString, 1000);
Edit2.Text := IntToStr(Number);
end;
117 - Quebra de String
Nesta dica iremos mostrar uma função que cria uma
lista de strings baseado numa cadeia de string,
quebrando-a onde encontrar um caractere
predeterminado. Por exemplo:
Uma string como ‘O céu é azul’, escolhendo o caracter
espaço (‘ ‘) para quebrar, seria tranformado em uma lista
de strings que, colocada em um componente do tipo
TListBox ficaria:
O
céu
é
azul
Isto é, onde havia um espaço a string foi “quebrada”.
function sBreakApart(BaseString,
BreakString: string; StringList:
TStringList): TStringList;
var
EndOfCurrentString: byte;
TempStr: string;
begin
repeat
EndOfCurrentString := Pos(BreakString,
BaseString);
if EndOfCurrentString = 0 then
StringList.add(BaseString)
else
StringList.add(Copy(BaseString, 1,
EndOfCurrentString - 1));
BaseString := Copy(BaseString,
EndOfCurrentString + length(BreakString),
length(BaseString) - EndOfCurrentString);
until EndOfCurrentString = 0;
result := StringList;
end;
procedure TForm1.Button1Click(Sender:
TObject);
var
t: TStringList;
begin
t := TStringList.create;
ListBox1.Items.Assign(sBreakApart(Edit1.Te
xt, ‘ ‘, t));
t.free;
end;
118 - Inserindo zeros no inicio de
um inteiro
Ex: Se o inteiro for 4 fica 00004. Se for 200, fica 00200.
var
s: string;
begin
FmtStr(s, ‘%.5d’, [StrToInt(edit1.text)]);
edit1.text := s;
end;
119 - Para dar a senha de uma
tabela Paradox no programa
Pode-se usar este código:
procedure TForm1.FormCreate(Sender:
TObject);
begin
Session.AddPassWord(‘MyPass’);
Table1.Active := True;
end;
120 - Pegando o registro do
windows
Unit Registry
procedure
TSplash_Form.FormActivate(Sender:
TObject);
var
reg: TRegIniFile;
begin
reg :=
TReginiFile.Create(‘SOFTWARE\MICROSOFT\MS
SETUP (ACME)');
Label1.Caption := reg.ReadString(‘USER
INFO’,‘DefName’,”);
reg.Free;
end;
121 - Fechar outro programa
1. Exemplo de como fechar a
calculadora a partir do texto da
janela
Procedure TForm1.Button1Click(Sender:
TObject);
begin
PostMessage(FindWindow(nil,
‘Calculadora’), WM_CLOSE,0,0);
end;
2. Exemplo de como fechar a
calculadora a partir da classe
Procedure TForm1.Button1Click(Sender:
TObject);
begin
PostMessage(FindWindow(‘scicalc’, nil),
WM_CLOSE,0,0);
end;
Obs.: A classe de um programa pode ser descoberta
usando o programa Winsight32 que vem com o delphi.
By Lloyd Dickinson
122 - Como Manipular arquivos
.INI 2
Os arquivos .INI são arquivos de texto que servem para
guardar informações úteis de configuração, como a
passagem de uma data de um programa para outro, o
arquivo .INI tem o formato:
[SEÇÃO]
variável=valor
Para usar um arquivo .INI seguem os passos abaixo:
* acrescentar na Uses do projeto a bibliteca IniFiles
uses IniFiles;
* criar uma variável do tipo TIniFile
var
data:TIniFile;
* Criar o arquivo .INI
Data := TIniFile.Create(‘Data.ini’);
Onde Data.ini é o nome do arquivo (você pode colocar
inclusive o caminho do arquivo, o padrão é o diretório do
Windows).
* Gravar a informação
Data.WriteString(‘Mes/Ano’,‘Data’,Edit1.Te
xt);
Data.Free; //esta linha libera a variável
da memória
Onde Mes/Ano é o nome da seção, Data é o nome da
variável e Edit1.Text é a data digitada pelo usuário
* Ler a informação
Crie outra variável no outro programa apenas para ler a
string
Data.TiniFile.Create(‘Data.ini’);
Data.ReadString(‘Mes/Ano’,‘Data’,”);
Data.Free;
123 - Pegando a data de um
arquivo
Unit SysUtils
var
DataArq: TDateFile;
begin
DataArq:=
FileDateToDateTime(FileAge(‘NomeDoArquivo’
));
end;
124 - Compactar tabelas
Esta rotina existe para o banco de dados local Paradox
pois, mesmo os registros sendo deletados pelo usuário,
as posições deles continuam sendo utilizadas mas os
dados não estão mais acessíveis.
uses BDE;
procedure CompactarTabela(Table:TTable);
var
TableDesc: CRTblDesc;
WasActive: Boolean;
hDataBase: hDbiDB;
begin
WasActive := Table.Active;
Screen.Cursor := crHourglass;
try
{abre se estava fechado para o obter o
DBHandle válido}
if not WasActive then
begin
Table.Open;
{obtem o handle do banco de dados e
fecha a tabela}
hDataBase := Table.DBHandle;
Table.Close;
{preenche o descritor da tabela}
FillChar(TableDesc, SizeOf (CRTblDesc),
0);
end;
with TableDesc do
begin
StrPCopy(szTblName, Table.TableName);
StrPCopy(szTblType, szParadox);
bPack := True;
end;
{reestrutura a tabela, empacotando-a}
if hdataBase<>nil then
Check(DbiDoRestructure(hDataBase, 1,
@TableDesc, nil, nil, nil, False))
else
Application.MessageBox(‘A tabela não
possui dados para
compactação’,‘Compactação’,0+16);
finally
Screen.Cursor := crDefault;
{por fim, reabre}
if WasActive then
Table.Open;
end;
end;
FileCtrl
procedure TForm1.Button1Click(Sender:
TObject);
var
Dir: string;
begin
Dir := ‘C:\APPS\SALES\LOCAL’;
destname:=destname+separa(scrname,’',Ocorr
e(scrname,’')+1);
end;
AssignFile(destination,destname);
Try
Rewrite(destination,1);
Except
CopiaArquivo:=2;
Exit;
end;
Repeat
BlockRead(source,buffer,sizeof(buffer),rea
dcnt);
Try
BlockWrite(destination,buffer,readcnt,writ
ecnt);
Except
CopiaArquivo:=3; {Disco Cheio?}
Exit;
end;
until (readcnt=0) or (writecnt<>readcnt);
CloseFile(destination);
CloseFile(source);
CopiaArquivo:=0;
end;
130 - Função que retorna o nome
do Computador
Uses Registry;
function TForm1.Getcomputer : string;
var
registro : tregistry;
begin
registro:=tregistry.create;
registro.RootKey:=HKEY_LOCAL_MACHINE;
registro.openkey(‘System\CurrentControlSet
\Services\VXD\VNETSUP’,false);
result:=registro.readstring(‘ComputerName’
);
end;
131 - Escondendo janelas filhas
minimizadas
Para esconder janelas filhas minimizadas, basta
capturar a mensagem WM_Size, desta maneira:
type
TForm1 = class(TForm)
public
procedure WMSize(var M :
TWMSIZE);Message WM_Size;
end;
implementation
procedure TForm1.WMSize(var M:TWMSIZE);
begin
if M.SizeType=Size_Minimized then
ShowWindow(Handle,Sw_Hide);
end;
132 - Executando uma única cópia
do aplicativo
Se você quiser executar uma única copia do aplicativo, o
código de inicializacao do arquivo fonte do PROJETO
pode ser escrito conforme segue:
program Project1;
uses
Forms,
Windows,
Dialogs,
Unit1 in ‘Unit1.pas’ {Form1};
{$R *.RES}
Var HprevHist : HWND;
begin
Application.Initialize;
HprevHist := FindWindow(Nil,
PChar(‘TheProgrammer’));
if HprevHist = 0 then begin
Application.Title := ‘TheProgrammer’;
Application.CreateForm(TForm1, Form1);
Application.Run;
end else
MessageDlg(‘Você não pode executar outra
cópia do aplicativo’, mtInformation,
[mbOK], 0);
Com esse código o usuário pode iniciar uma nova copia
do aplicativo somente se não houver outra anterior.
Caso contrario é exibido uma mensagem para o usuário.
133 - Alterar as cores do título de
um DBGrid em tempo execução
Procedure TForm1.DBGrid1TitleClick(Column:
TColumn); var
I : integer;
begin
for i:=0 to DBGrid1.Columns.count-1 do
begin
DBGrid1.Columns[i].Title.Color :=
clBtnFace;
DBGrid1.Columns[i].Title.Font.Color :=
clBlack;
DBGrid1.Columns[i].Title.Font.Style :=
[];
end;
Column.Title.color := ClYellow;
Column.Title.Font.Style := [ fsBold,
fsItalic];
Column.Title.Font.Color := clRed;
end;
134 - Como fazer para o
computador soar o beep
messageBeep(0);
135 - Como mostrar o mouse como
uma ampulheta
try
Screen.Cursor := crHourGlass;
{ Escreva o ação a executar aqui }
finally
Screen.Cursor := crDefault;
end;
Application.ProcessMessages;
136 - Como controlar o
pressionamento da tecla Enter
procedure TForm1.EditKeyPress(Sender:
TObject; var Key: Char);
{ através do evento onKeyPress do
formulário de controle… }
begin
{ se a “var Key” retornar o código #13
corresponde a <Enter>, #9 corresponde a
tecla TAB }
if Key = #13 then
begin
Key := #0 { Suprime o som }
{ escreva aqui os seus comandos }
end;
end;
137 - Como varrer uma tabela
inteira
Table1.First;
if not Table1.Eof then
repeat
{ seus comandos para a tabela }
Table1.Next
until Table1.Eof;
138 - Como Copiar os valores de
campos de uma tabela para outra
{ Este exemplo copia apenas tabelas de
mesma estrutura }
var
Num: SmallInt;
begin
for Num := 0 to TabelaOrigem.FieldCount
- 1 do
begin
TabelaDestino.Insert;
TabelaDestino.Fields[Num].Assign(TabelaOri
gem.Fields[Num]);
TabelaDestino.Post;
end;
end;
Observação enviada por um dos
usuários da DTDelphi sobre a dica
acima:
Achei um erro na dica número 138, tentei utiliza-la e nao funcionou…
Mas corrigi o código, basta tirar duas linhas do looping FOR.
//CODIGO CORRETO
{ Este exemplo copia apenas tabelas de mesma estrutura }
var
Num: SmallInt;
begin
TabelaDestino.Insert;
for Num := 0 to TabelaOrigem.FieldCount - 1 do
TabelaDestino.Fields[Num].Assign(TabelaOrigem.Fields[Num
]);
TabelaDestino.Post;
end;
function Pred(X);
Retorna o predecessor de um ordinal
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := ‘The predecessor of 5 is ‘ + IntToStr(Pred(5)) + #13#10;
S := S + ‘The successor of 10 is ‘ + IntToStr(Succ(10)) + #13#10;
if Succ(RED) = BLUE then
S := S + ‘In the type Colors, RED is the predecessor of BLUE.’;
MessageDlg(S, mtInformation, [mbOk], 0);
end;
procedure Randomize;
Inicializa o modo Randomico
var
I: Integer;
begin
Randomize;
for I := 1 to 50 do begin
{ Write to window at random locations }
Canvas.TextOut(Random(Width), Random(Height), ‘Boo!’);
end;
end;
function Succ(X);
Retorna o sucessor de um ordinal
uses Dialogs;
type
Colors = (RED,BLUE,GREEN);
var
S: string;
begin
S := ‘The predecessor of 5 is ‘ + IntToStr(Pred(5)) + #13#10;
S := S + ‘The successor of 10 is ‘ + IntToStr(Succ(10)) + #13#10;
if Succ(RED) = BLUE then
S := S + ‘In the type Colors, RED is the predecessor of BLUE.’;
MessageDlg(S, mtInformation, [mbOk], 0);
end;
Especificador Descrição
d (decimal) O valor inteiro correspondente é convertido
para uma string de dígitos decimais
x O valor inteiro correspondente é convertido
(hexadecimal) para uma string de dígitos hexadecimais
p (ponteiro) O valor inteiro correspondente é convertido
para uma string expressa com dígitos
decimais
s (string) A string correnpondente, caractere, ou valor
Pchar é copiado para uma string
e O valor de ponto flutuante correspondente é
(hexadecimal) convertido para uma string.
f (ponto O valor de ponto flutuante correspondente é
flutuate) convertido para uma string.
g (geral) O valor de ponto flutuante correspondente é
convertido para uma string decimal menor
possível usando notação de ponto flutuante
ou exponencial.
x (número) O valor de ponto flutuante correspondente é
convertido para uma string de ponto
flutuante mas usa também separador de
milhares.
m (moeda) O valor de ponto flutuante correspondente é
convertido para uma string representando
uma quantidade em dinheiro. A conversão é
baseada nas configurações regionais.
147 - Como controlar o fechamento
de um formulário
procedure TForm1.FormCloseQuery(Sender:
Tobject;
var CanClose: Bolean);
begin
if MessageDlg ( ‘Você tem certeza de que
quer sair?’,
mtConfirmation, [mbYes, mbNo], 0) = idNo
then
Canclose:=False;
end;
148 - Método de procura em tabela
indexada
procedure TSaida.Edit1Change(Sender:
TObject);
begin
Table1.setkey;
Table1Notasaida.AsString:=Edit1.text;
Table1.GotoNearest;
end;
149 - Como evitar repetição em
uma lista de ComboBox
procedure TProcRep.ComboBox1Click(Sender:
TObject);
begin
WITH COMBOBOX1 DO
IF (TEXT <> ”) AND (ITEMS.INDEXOF (TEXT) <
0) THEN
ITEMS.ADD (TEXT);
end;
150 - Caracteres Especiais que
compõem uma MaskEdit
Caracter Descrição
! Espaços em branco não aparecerão
Todos os caracteres seguintes serão
>
maiúsculos até que apareça o caracter
Todos os caracteres seguintes serão
<
minúsculos até que apareça o caracter
\ Indica um caracter literal
l (L Somente caracter alfabético
minusculo)
Obrigatoriamente um caracter alfabético (A-
L
Z, a-z)
a Somente caracter alfanumérico
Obrigatoriamente caractere alfanumérico (
A
A-Z, a-z, 0-9)
9 Somente caracter numérico
0 Obrigatoriamente caracter numérico
c permite um caracter
C Obrigatoriamente um caracter
Permite um caracter numérico ou sinal de
#
mais ou de menos, mas não os requer.
: Separador de horas, minutos e segundos
/ Separador de dias, meses e anos
151 - Exemplo de Arraste
{Este exmplo faz que o painel fique com a
cor da label que originou o arraste.
Somente a Label(Tlabel)}
{no exemplo as labels devem ter a
propriedade DRAGMODE=AUTOMATIC}
procedure TForm1.Panel1DragOver (Sender.
Source: TObject; x,y:Integer;
State:TDragState; var Accept: Boolean);
begin
Accept:=Source is Tlabel;
end;
procedure ShowDate;
begin
TForm1.Timer1Timer(Sender);
Timer1.Enabled := True;
end;
procedure NShowDate;
begin
Timer1.Enabled := False;
Application.Title := ‘Título do
Aplicativo’;
end;
Este exemplo considera que o aplicativo possua um
relógio que atualiza de tempos em tempos (a cada 250
milésimos de segundo por exemplo). Este é desabilitado
quando o formulário é restaurado.
158 - Executando ações padrão de
um Ole Container
Para executar ações padrão de um Ole Container (abrir
um documento Word ou Excel ou rodar uma
apresentação Powerpoint), pode-se usar este código:
procedure TForm1.Button1Click(Sender:
TObject);
begin
OleContainer1.DoVerb(ovprimary);
end;
159 - Verificando se há uma cópia
em execução
program Project1;
uses
Forms,
windows,
dialogs,
Unit1 in ‘Unit1.pas’ {Lloydsoft};
{$R *.RES}
var
Hwnd: Thandle;
begin
Hwnd := FindWindow (‘TLloydSoft’, ‘LloydSoft’);
if Hwnd = 0 then
begin
Application.Initialize;
Application.CreateForm(TLloydsoft, Lloydsoft);
Application.Run;
end
else
begin
MessageDlg (‘Este programa já esta aberto’,mtinformation,[mbok], 0);
SetForegroundWindow (Hwnd);
end;
end.
{obs: para o exemplo acima funcionar a propriedade Caption do Formulário deve ser ‘LloydSoft’}
160 - Alterando o glyph dos botões
do DbNavigator
Declare um novo tipo na sua unit:
type
NewTypeNav = class( TDbNavigator );
Depois é só utilizar:
NewTypeNav( DbNavigator1
).Buttons[nbInsert].Glyph := …
161 - PARADOX EM REDE
Arquivos Paradox podem ser compartilhados em rede.
Para que isto ocorra devemos :
·Adicionar o DATABASE ENGINE CONFIGURATION
(BDE CONFIG)
·Selecionar a página DRIVERS
·Selecionar o driver PARADOX e alterar o parâmetro
NET DIR para o local onde serão gravados os arquivos
de controle para compartilhamento. Por exemplo,
“G:\MEUAPLIC”, onde G : corresponde ao drive de rede
e MEUAPLIC, o diretório aonde está o aplicativo
(executável)
·Depois selecionar a página SYSTEM
·Alterar o parâmetro LOCAL SHARE para TRUE. Após
isto o BDE controlará o compartilhamento de arquivos
PARADOX em rede
162 - Hint Com Quebra De Linha
Para incluir mais de uma linha no Hint você deve utilizar
o evento OnMouseMove de cada componente. Veja
abaixo como ficará o código em um Edit por exemplo.
procedure TForm1.Edit1MouseMove(Sender:
TObject; Shift: TShiftState; X, Y:
Integer);
begin
Edit1.hint := ‘Primeira
Linha’+#13+‘Segunda Linha’+#13+ ‘Terceira
Linha’+#13+‘Quarta Linha’;
end;
Obs. Não esquecer de mudar para TRUE o evento
ShowHint
163 - AutoOcultar a barra de
tarefas
Ocultar…….
ShowWindow(FindWindow(‘Shell_TrayWnd’,
nil), SW_HIDE);
Mostrar…..
ShowWindow(FindWindow(‘Shell_TrayWnd’,
nil), SW_SHOWNORMAL);
Voltar como Estava…..
ShowWindow(FindWindow(‘Shell_TrayWnd’,
nil), SW_RESTORE);
164 - Como mover um componente
em Run-time
No exemplo abaixo deve ser incluído um componente
Button. Para testar este exemplo mantenha a tecla
CTRL pressionada clique com o mouse no componente
Button. Feito isto, basta arrastar o componente Button
para qualquer lado.
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1MouseDown(Sender:
TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure Button1MouseMove(Sender:
TObject; Shift: TShiftState; X,
Y: Integer);
procedure Button1MouseUp(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
MouseDownSpot : TPoint;
Capturing : bool;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Edit1Exit(Sender:
TObject);
begin
Edit1.Text :=
FormatFloat(‘000000’,StrToFloat(Edit1.Text
));
end;
167 - Mostrar o HINT num Panel
procedure TForm1.FormCreate(Sender:
TObject);
begin
Application.OnHint := DisplayHint;
end;
procedure TForm1.DisplayHint(Sender:
TObject);
begin
Panel1.Caption := Application.Hint;
end;
uses Winsock;
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
var
wVersionRequested : WORD;
wsaData : TWSAData;
begin
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
end;
procedure TForm1.FormDestroy(Sender:
TObject);
begin
WSACleanup;
end;
procedure TForm1.BtnIPClick(Sender:
TObject);
var
p : PHostEnt;
s : array[0..128] of char;
p2 : pchar;
begin
GetHostName(@s, 128);
p := GetHostByName(@s);
Memo1.Lines.Add(p^.h_Name);
p2 :=
iNet_ntoa(PInAddr(p^.h_addr_list^)^);
Memo1.Lines.Add(p2);
end;
end.
170 - Verificando se já estou
conectado na Internet
Use o componente TCP para fazer isso.
procedure TForm1.Button1Click(Sender:
TObject);
begin
if TCP1.LocalIp = ‘0.0.0.0’ then
ShowMessage(‘Você não está conectado!’);
end;
171 - Desabilitar o botão fechar o
form
procedure TForm1.Button1Click(Sender:
TObject);
var
hwndHandle : THANDLE;
hMenuHandle : HMENU;
begin
hwndHandle := FindWindow(nil, ‘Sem título
- Bloco de Notas’);
if (hwndHandle <> 0) then
begin
hMenuHandle := GetSystemMenu(hwndHandle,
FALSE);
if (hMenuHandle <> 0) then
DeleteMenu(hMenuHandle, SC_CLOSE,
MF_BYCOMMAND);
end;
end;
172 - Chamar um site utilizando o
seu browse padrão
uses UrlMon;
procedure TForm1.Button1Click(Sender:
TObject);
begin
HlinkNavigateString(nil,‘http://www.lloyds
oft.hpg.ig.com.br’);
End;
173 - Localizar arquivos do
Windows
procedure TForm1.Button1Click(Sender:
TObject);
begin
with TDDEClientConv.Create(Self) do
begin
ConnectMode := ddeManual;
ServiceApplication := ‘explorer.exe’;
SetLink( ‘Folders’, ‘AppProperties’);
OpenLink;
ExecuteMacro(‘[FindFolder(,
C:\Windows)]’, False);
CloseLink;
Free;
end;
end;
174 - Criar um documento no Word
Uses ComObj
procedure TForm1.Button1Click(Sender:
TObject);
var
MSWord: Variant;
begin
MSWord:= CreateOleObject (‘Word.Basic’);
MSWord.AppShow;//mostra o word
MSWord.FileNew;//inicia um novo
documento
MSWord.insert(‘Contrato de Locação’);
//Escreve algo
MSWord.insert(#13+‘Contrato de
Locação’);//Pula uma linha e escreve
MSWord.FontSize(24);//muda o tamanho da
fonte
MSWord.italic;//coloca italico
MSWord.bold;//coloca negrito
MSWord.underline;//sublina
MSWord.insert(#13+‘Contrato de
Locação’);//pula a linha e escreve
novamente
MSWord.FontSize(12);//muda o tamanho da
fonte
MSWord.Font(‘Arial’);//muda a fonte
usada
MSWord.underline(false);//retira o
sublinhado
MSWord.italic(false);//retira o italico
MSWord.bold(false);//retira o bold
MSWord.insert(#13 +‘teste’);
MSWord.insert(#13+#9 +‘teste’);//nova
linha e um TAB
MSWord.insert(#13+Table1Razao_Social.Value
);//insere algo de uma tabela
MSWord.LineUp(2, 1); //seleciona uma
parte do texto
MSWord.TextToTable(ConvertFrom := 2,
NumColumns := 1);// monta uma tabela com o
texto selecionado
MSWord.FileSaveAs(‘c:\temp\test.txt’,
3); //Salva o arquivo
end;
MSWord.JustifyPara; // alinhamento
justificado
MSWord.RightPara; // alinhamento a direita
MSWord.LeftPara; // alinhamento a esquerda
MSWord.InsertPageBreak; // quebrar página
175 - Ativar a proteção de tela do
Windows.
Inclua na seção uses: Windows
{ Ativa a proteção de tela do Windows, se
estiver configurada. }
SendMessage(Application.Handle,
WM_SYSCOMMAND, SC_SCREENSAVE, 0);
176 - Desligar/Ligar monitor
Inclua na seção uses: Windows
No Win95 podemos desligar o monitor afim de
economizar energia elétrica. Normalmente este recurso
é controlado pelo próprio Windows. Porém sua
aplicação Delphi também pode fazer isto. O exemplo
abaixo desliga o monitor, aguarde 5 segundos e re-liga
monitor.
SendMessage(Application.Handle,
WM_SYSCOMMAND,
SC_MONITORPOWER, 0);
Sleep(5000); { Aguarde 5 segundos }
SendMessage(Application.Handle,
WM_SYSCOMMAND,
SC_MONITORPOWER, -1);
Observações
Este recurso pode não funcionar dependendo da
configuração do sistema.
177 - Abrir e fechar o drive de
CD-ROM
Inclua na seção uses: MMSystem
{ Para abrir }
mciSendString(‘Set cdaudio door open
wait’, nil, 0, handle);
{ Para fechar }
mciSendString(‘Set cdaudio door closed
wait’, nil, 0, handle);
178 - Copiar todos os registros de
uma tabela para o Clipboard
Inclua na seção uses: Clipbrd
procedure TForm1.Button1Click(Sender:
TObject);
const
SeparadorCampoValor = ‘: ‘;
SeparadorCampo = #13#10; { Quebra de
linha }
SeparadorRegistro = ‘===========’ +
#13#10;
var
S: string;
I: integer;
begin
S := ”;
Table1.First;
while not Table1.EOF do begin
for I := 0 to Table1.FieldCount -1 do
S := S + Table1.Fields[I].FieldName +
SeparadorCampoValor +
Table1.Fields[I].AsString +
SeparadorCampo;
S := S + SeparadorRegistro;
Table1.Next;
end;
Clipboard.AsText := S;
end;
Para testar:
- Execute este aplicativo;
- Clique no botão;
- Vá em outro aplicativo (ex: MS-Word) e mande colar
(Ctrl+V).
Observações
CUIDADO! Não use este recurso com tabelas grandes,
pois poderá usar memória demasiadamente. No teste
que fiz, o tamanho da string S atingiu 20K e funcionou
normalmente. Mas isto pode variar de uma máquina
para outra.
179 - Personalizar a caixa de
mensagem de exceções (erro) do
Delphi
- Declare um método (procedure) na seção private do
form principal conforme abaixo:
private
procedure ManipulaExcecoes(Sender:
TObject; E: Exception);
- Vá até a seção implementation e implemente este
método, conforme o exemplo:
procedure TForm1.ManipulaExcecoes(Sender:
TObject; E: Exception);
begin
MessageDlg(E.Message + #13#13 +
‘Suporte técnico:’#13 +
‘tecnobyte@ulbrajp.com.br’,
mtError, [mbOK], 0);
end;
ProgressBar1.PaintTo(StatusBar.Canvas.Hand
le, Rect.Left, Rect.Top);
end;
end;
- Coloque um Button no form
- Digite no evento OnClick do Button o código abaixo:
procedure TForm1.Button1Click(Sender:
TObject);
var
I: integer;
begin
for I := ProgressBar1.Min to
ProgressBar1.Max do begin
{ Atualiza a posição da ProgressBar }
ProgressBar1.Position := I;
{ Repinta a StatusBar para forçar a
atualização visual }
StatusBar1.Repaint;
{ Aguarda 50 milisegundos }
Sleep(50);
end;
EnumDisplaySettings(nil,Listbox1.ItemIndex
,Devmode);
ChangeDisplaySettings(DevMode,0);
end;
Observações
Nos testes que fiz, nem tudo funcionou adequadamente.
Mas vale a pena experimentar
184 - Simular um CharCase no
DBGrid
Para converter a digitação para maiúsculo, coloque isto
no evento OnKeyPress do DBGrid:
Key := AnsiUpperCase(Key)[1];
Para converter para minúsculo, troque por:
Key := AnsiLowerCase(Key)[1];
185 - Verificar se uma string é
uma data válida
Escreva a função abaixo:
function tbStrIsDate(const S: string):
boolean;
begin
try
StrToDate(S);
Result := true;
except
Result := false;
end;
end;
Para testar:
- Coloque um Edit no form;
- Coloque um Button;
- No evento OnClick do botão coloque o código abaixo:
if tbStrIsDate(Edit1.Text) then
ShowMessage(Edit1.Text + ‘ é data
válida.’)
else
ShowMessage(Edit1.Text + ‘ NÃO é data
válida.’);
186 - Limpar um campo tipo data
via programação
Table1.FieldByName(‘Data’).Clear;
{ ou }
Table1.FieldByName(‘Data’).AsString := ”;
Observações
Podemos usar este recurso para limpar também campos
numéricos, string, etc.
187 - Obter o endereço IP do
Dial-Up
Inclua na seção uses: WinSock
{ Esta função retorna o endereço IP do Dial-Up. }
{ Evento Asterisco }
MessageBeep(64);
196 - Trabalhar com Filter de
forma mais prática
Se você está habituado a usar este código no filter…
Table1.Filter := ‘Nome = ”’+ Edit1.Text +
””;
ou
Table1.Filter := ‘Data = ”’ +
DateToStr(Date) + ””;
Tente usar este:
Table1.Filter := ‘Nome = ‘ +
QuotedStr(Edit1.Text);
ou
Table1.Filter := ‘Data = ‘ +
QuotedStr(DateToStr(Date));
Observações
A função QuitedStr() coloca apóstrofos envolvendo a
string. Se houver um apóstrofo como parte da string, ela
o subtitui por dois apóstrofos, para que seja
corretamente interpretado.
197 - Reproduzir um arquivo WAV
Inclua na seção uses: MMSystem
PlaySound(‘C:\ArqSom.wav’, 1, SND_ASYNC);
Observações
Troque o nome do arquivo (C:\ArqSom.wav) pelo
arquivo desejado
198 - Copiar arquivos usando
curingas (*.*)
{ - Coloque um Button no Form;
- Altere o evento OnClick deste Button conforme
abaixo: }
procedure TForm1.Button2Click(Sender:
TObject);
var
SR: TSearchRec;
I: integer;
Origem, Destino: string;
begin
I := FindFirst(‘c:\Origem\*.*’,
faAnyFile, SR);
while I = 0 do begin
if (SR.Attr and faDirectory) <>
faDirectory then begin
Origem := ‘c:\Origem' + SR.Name;
Destino := ‘c:\Destino' + SR.Name;
if not CopyFile(PChar(Origem),
PChar(Destino), true) then
ShowMessage(‘Erro ao copiar ‘ + Origem +
‘ para ‘ + Destino);
end;
I := FindNext(SR);
end;
end;
Observações
No exemplo acima, se o arquivo já existir no destino, a
função falha (não copia). Para que a função possa
sobreescrever o arquivo destino (caso exista), altere o
último parâmetro de CopyFile para false. CUIDADO! Se
um arquivo for sobreescrito, estará perdido para sempre!
199 - Excluir arquivos usando
curingas (*.*)
{ - Coloque um Button no Form;
- Altere o evento OnClick do Button conforme abaixo: }
procedure TForm1.Button2Click(Sender:
TObject);
var
SR: TSearchRec;
I: integer;
begin
I := FindFirst(‘c:\Teste\*.*’,
faAnyFile, SR);
while I = 0 do begin
if (SR.Attr and faDirectory) <>
faDirectory then
if not DeleteFile(‘c:\Teste' + SR.Name)
then
ShowMessage(‘Não consegui excluir
c:\Teste' + SR.Name);
I := FindNext(SR);
end;
end;
Observações
No exemplo acima todos os arquivos do diretório
c:\Teste serão excluídos. CUIDADO! Arquivos excluídos
desta forma não vão para a lixeira.
200 - Definir a quantidade de
registros a ser impressa em uma
página do QuickReport
1. A forma mais simples consiste em alterar a altura
(Height) da banda Detail do nosso relatório de modo que
a altura total da página seja inferior a duas vezes a
altura da banda. Desta forma, cada registro será
impresso em uma nova página, teoricamente por falta
de espaço na página atual.
2. Uma outra forma mais sofisticada é usar o evento
AfterPrint da banda Detail. Nele testamos se ainda não
chegou no fim a tabela e, caso positivo, pedimos uma
nova página:
if not Table1.EOF then
QuickRep1.NewPage;
Deve existir outras alternativas, mas as duas anteriores
funcionaram bem nos testes realizados.
201 - Para que servem
OnGetEditMask, OnGetEditText e
OnSetEditText do TStringGrid
O evento OnGetEditMask ocorre quando entramos no
modo de edição. Neste momento podemos verificar em
qual linha/coluna se encontra o cursor e então, se
quiser, poderá especificar uma máscara de edição.
Exemplo:
procedure
TForm1.StringGrid1GetEditMask(Sender:
TObject; ACol, ARow: Integer; var Value:
String);
begin
if (ARow = 1) and (ACol = 1) then
Value := ‘(999) 999-9999;1;_’; //
Telefone
end;
O evento OnGetEditText ocorre também quando
entramos no modo de edição. Neste momento podemos
manipularmos o texto da célula atual (linha/coluna) e
então podemos simular algo tal como uma tabela onde
opções podem ser digitadas através de números.
Exemplo:
procedure
TForm1.StringGrid1GetEditText(Sender:
TObject; ACol, ARow: Integer; var Value:
String);
begin
if (ARow = 1) and (ACol = 2) then begin
if StringGrid1.Cells[ACol, ARow] =
‘Ótimo’ then
Value := ‘1’
else if StringGrid1.Cells[ACol, ARow] =
‘Regular’ then
Value := ‘2’
else if StringGrid1.Cells[ACol, ARow] =
‘Ruim’ then
Value := ‘3’;
end;
end;
procedure TForm1.Timer1Timer(Sender:
TObject);
begin
FlashWindow(Handle, true);
FlashWindow(Application.Handle, true);
end;
203 - Posicionar o cursor do mouse
em um controle
Inclua na seção uses: Windows
{ Digite a procedure abaixo imediatamente após a
palavra implementation no código do seu formulário. }
procedure MouseParaControle(Controle:
TControl);
var
IrPara: TPoint;
begin
IrPara.X := Controle.Left +
(Controle.Width div 2);
IrPara.Y := Controle.Top +
(Controle.Height div 2);
if Controle.Parent <> nil then
IrPara :=
Controle.Parent.ClientToScreen(IrPara);
SetCursorPos(IrPara.X, IrPara.Y);
end;
{ Para testar, coloque no Form um botão e
troque o name dele para btnOK e modifique
o evento OnShow do Form conforme abaixo: }
procedure TForm1.FormShow(Sender:
TObject);
begin
MouseParaControle(btnOk);
end;
Observações
A função “MouseParaControle” recebe um parâmetro do
tipo TControl. Isto significa que você poderá passar para
ela qualquer controle do Delphi, tais como: TEdit,
TButton, TSpeedButton, TPanel, etc. Pode ser até
mesmo o próprio Form.
204 - Mostrar o Hint para cada
coluna do StringGrid
Para testar o exemplo abaixo inclua no seu form um
componente StringGrid
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
procedure StringGrid1MouseMove(Sender:
TObject; Shift: TShiftState; X,
Y: Integer);
private
{ Private declarations }
public
{ Public declarations }
Col,Row : integer; // Declarar esta
variável
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// Evento OnCreate do Form
procedure TForm1.FormCreate(Sender:
TObject);
begin
StringGrid1.Hint := ‘0 0’;
StringGrid1.ShowHint := True;
end;
// Evento OnMouseMove do componente
StringGrid
procedure
TForm1.StringGrid1MouseMove(Sender:
TObject; Shift: TShiftState;
X, Y: Integer);
var r,c : integer;
begin
StringGrid1.MouseToCell(X, Y, C, R);
if ((Row <> r) or (Col <> c)) then
begin
Row := r; Col := c;
Application.CancelHint;
StringGrid1.Hint := ‘Linha:
‘+IntToStr(r)+#32+‘Coluna: ‘+IntToStr(c);
end;
end;
205 - Mudar o papel de parede 3
Para testar o exemplo abaixo inclua no seu form um
componente Button e no evento OnClick o código
abaixo:
procedure TForm1.Button1Click(Sender:
TObject);
begin
SystemParametersInfo(SPI_SETDESKWALLPAPER,
0,
PChar(‘C:\windows\Arenito.bmp’),SPIF_SENDW
ININICHANGE);
end;
206 - Arquivos AVI e WAV em
tabelas
O exemplo abaixo demonstra como gravar um arquivo
.AVI ou .WAV dentro de um arquivo paradox. Mostra
também como reproduzir estes arquivos.
Para que o código abaixo funcione inclua em um Form
02 componentes Button, 01 componente Panel, 01
componente DBGrid, 01 componente Table, 01
componente DataSource e 01 componente OpenDialog.
Crie um arquivo Paradox com a seguinte estrutura:
Nome Tipo Tamanho
Codigo +
Nome A 100
Avi B
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, DBTables, ExtCtrls, MPlayer,
DBCtrls, Grids, DBGrids;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Panel1: TPanel;
OpenDialog1: TOpenDialog;
Table1Codigo: TAutoIncField;
Table1Nome: TStringField;
Table1Avi: TBlobField;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var
Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var Form1: TForm1;
FileName : string;
MediaPlayer1 : TMediaPlayer;
implementation
{$R *.DFM}
{Esta função cria um arquivo temporário
para o sistema}
function GetTemporaryFileName : string;
{$IFNDEF WIN32}
const MAX_PATH = 144;
{$ENDIF}
var
{$IFDEF WIN32}
lpPathBuffer : PChar;
{$ENDIF}
lpbuffer : PChar;
begin
{Get the file name buffer}
GetMem(lpBuffer, MAX_PATH);
{$IFDEF WIN32}
{Get the temp path buffer}
GetMem(lpPathBuffer, MAX_PATH); {Get the
temp path}
GetTempPath(MAX_PATH, lpPathBuffer); {Get
the temp file name}
GetTempFileName(lpPathBuffer,‘tmp’,0,lpBuf
fer);
FreeMem(lpPathBuffer, MAX_PATH);
{$ELSE} {Get the temp file name}
GetTempFileName(GetTempDrive(‘C’),‘tmp’,0,
lpBuffer);
{$ENDIF} {Create a pascal string containg}
{the temp file name and return it}
result := StrPas(lpBuffer);
{Free the file name buffer}
FreeMem(lpBuffer, MAX_PATH);
end;
{Grava AVI ou Wav no arquivo PARADOX}
procedure TForm1.Button1Click(Sender:
TObject);
var FileStream: TFileStream; {para ler o
arquivo avi}
BlobStream: TBlobStream; {para salvar no
campo blob}
begin
Application.ProcessMessages;
Button1.Enabled := false;
Button2.Enabled := false;
if OpenDialog1.Execute then
FileStream :=
TFileStream.Create(OpenDialog1.FileName,fm
OpenRead);
Table1.Append;
Table1Nome.Value := OpenDialog1.FileName;
BlobStream :=
TBlobStream.Create(Table1AVI,
bmReadWrite);
BlobStream.Seek(0, soFromBeginning);
BlobStream.Truncate;
BlobStream.CopyFrom(FileStream,
FileStream.Size);
FileStream.Free;
BlobStream.Free;
Table1.Post;
Button1.Enabled := true;
Button2.Enabled := true;
end;
{Reproduz o que está gravado no campo
Blob}
procedure TForm1.Button2Click(Sender:
TObject);
var FileStream: TFileStream; {a temp file}
BlobStream: TBlobStream; {the AVI Blob}
begin
BlobStream :=
TBlobStream.Create(Table1AVI, bmRead);
if BlobStream.Size = 0 then
begin
BlobStream.Free;
Exit;
end;
MediaPlayer1.Close; {Reset the file name}
MediaPlayer1.FileName := ”; {Refresh the
play window}
MediaPlayer1.Display := Panel1;
Panel1.Refresh;
if FileName <> ” then
DeleteFile(FileName); {Get a temp file
name}
FileName := GetTemporaryFileName; {Create
a temp file stream}
FileStream :=
TFileStream.Create(FileName,fmCreate or
fmOpenWrite);
FileStream.CopyFrom(BlobStream,
BlobStream.Size); {Free the streams}
FileStream.Free; BlobStream.Free;
MediaPlayer1.FileName := filename;
MediaPlayer1.DeviceType := dtAviVideo;
MediaPlayer1.Open;
MediaPlayer1.Play;
end;
// Evento OnDestroy do Form
procedure TForm1.FormDestroy(Sender:
TObject);
begin
MediaPlayer1.Close;
MediaPlayer1.FileName := ”;
if FileName <> ” then
DeleteFile(FileName);
end;
// Evento OnShow do Form
procedure TForm1.FormShow(Sender:
TObject);
begin
MediaPlayer1 := TMediaPlayer.Create(self);
with MediaPlayer1 do
begin
Parent := self ;
Visible := False;
end;
Table1.Open;
end;
// Evento OnClose do Form
procedure TForm1.FormClose(Sender:
TObject; var Action: TCloseAction);
begin
Table1.Close;
end;
end.
207 - Copiar registros de uma
tabela para outra incluindo valores
NULL
Procedure TtableCopiaRegistro(Origem,
Destino: Ttable);
begin
with TabelaOrig do
begin
{Inicia um contador para os campos da
TabelaOrig}
for i := 0 to FieldCount -1 do
{Este if verifica se o campo da TabelaOrig
é NULL, se for, atribui seu valor ao campo
da TabelaDest}
if not Fields[i].IsNull then
TabelaDest.Fields[i].Assign(Fields[i]);
end; {end with}
end;
Este exemplo funcionará com todos tipos de campos se
você tiver acabado de criar a TabelaDest.
Para criar um dado valor NULL :
Fields[i].Clear
208 - Jogar uma imagem direto
para um campo da tabela
procedure TForm1.Button1Click(Sender:
TObject);
var BMP: TBitMap;
begin
BMP := TBitMap.Create;
if OpenPictureDialog1.Execute then
begin
if Table1.State in [dsInsert, dsEdit] then
begin
BMP.LoadFromFile(OpenPictureDialog1.FileNa
me);
Table1Graphic.Assign( BMP );
end;
end;
end;
209 - Retornar a coluna ativa do
DBGrid
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
Db, DBTables, Grids, DBGrids;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
procedure DBGrid1ColEnter(Sender:
TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.DBGrid1ColEnter(Sender:
TObject);
begin
Caption :=
DBGrid1.SelectedField.FieldName;
end;
210 - Imprimir em impressora
matricial em modo caracter
Procedure TForm1.Button1Click(Sender:
TObject);
var Arquivo : TextFile;
begin
AssignFile(Arquivo,‘LPT1’);
Rewrite(Arquivo);
Writeln(Arquivo,‘Teste de impressao -
Linha 0’);
Writeln(Arquivo,‘Teste de impressao -
Linha 1’);
Writeln(Arquivo,#27#15+‘Teste de Impressão
- Linha 2’);
Writeln(Arquivo,‘Teste de impressao -
Linha 3’);
Writeln(Arquivo,#27#18+‘Teste de Impressão
- Linha 4’);
Writeln(Arquivo,‘Teste de impressao -
Linha 5’);
Writeln(Arquivo,#12); // Ejeta a página
CloseFile(Arquivo);
end;
211 - Gravar imagem JPG em
tabela Paradox
Procedure Grava_Imagem_JPEG(Tabela:TTable;
Campo:TBlobField;
Foto:TImage; Dialog:TOpenPictureDialog);
var BS:TBlobStream;
MinhaImagem:TJPEGImage;
Begin
Dialog.InitialDir := ‘c:\temp’;
Dialog.Execute;
if Dialog.FileName <> ” Then
Begin
if not (Tabela.State in [dsEdit,
dsInsert]) Then
Tabela.Edit;
BS := TBlobStream.Create((Campo as
TBlobField), BMWRITE);
MinhaImagem := TJPEGImage.Create;
MinhaImagem.LoadFromFile(Dialog.FileName);
MinhaImagem.SaveToStream(BS);
Foto.Picture.Assign(MinhaImagem);
BS.Free;
MinhaImagem.Free;
Tabela.Post;
DBISaveChanges(Tabela.Handle);
End;
End;
procedure TForm1.Button1Click(Sender:
TObject);
begin
Grava_Imagem_JPEG(TbClientes,TbClientesCli
_Foto, Image1,
OpenPictureDialog1);
// TbClientes é o nome de alguma Tabela
// TbClientesCli_Foto é um variavel da
tabela do tipo Blob
// Image1 é um componente
// OpenPictureDialog1 é o componente para
abrir a figura
end;
212 - Ler imagem JPG da tabela
Paradox
Procedure Le_Imagem_JPEG(Campo:TBlobField;
Foto:TImage);
var BS:TBlobStream;
MinhaImagem:TJPEGImage;
Begin
if Campo.AsString <> ” Then
Begin
BS := TBlobStream.Create((Campo as
TBlobField), BMREAD);
MinhaImagem := TJPEGImage.Create;
MinhaImagem.LoadFromStream(BS);
Foto.Picture.Assign(MinhaImagem);
BS.Free;
MinhaImagem.Free;
End
Else
Foto.Picture.LoadFromFile(‘c:\temp\limpa.j
pg’);
End;
procedure TForm1.Button1Click(Sender:
TObject);
begin
Le_Imagem_JPEG(TbClientesCli_Foto,
Image1);
// TbClientesCli_Foto é um variavel da
tabela do tipo Blob
// Image1 é um componente
end;
213 - Como saber quantos dias tem
no mes
function TForm1.AnoBiSexto(Ayear:
Integer): Boolean;
begin
// Verifica se o ano é Bi-Sexto
Result := (AYear mod 4 = 0) and ((AYear
mod 100 <> 0) or
(AYear mod 400 = 0));
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
Label1.Caption :=
IntToStr(DiasPorMes(1999, 10));
end;
214 - Como saber se o ano é
bisexto
function TForm1.AnoBiSexto(Ayear:
Integer): Boolean;
begin
Result := (AYear mod 4 = 0) and ((AYear
mod 100 <> 0) or
(AYear mod 400 = 0));
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
if AnoBiSexto(1999) Then
ShowMessage(‘Ano de 1999 é Bisexto’)
Else ShowMessage(‘Ano de 1999 não é
Bisexto’);
end;
215 - Colocar o mes por extenso
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms,
Dialogs,StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
function MesExtenso( Mes:Word ) : string;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
begin
label1.Caption := MesExtenso(3);
end;
end.
216 - Chamar um e-mail pelo Delphi
Uses Shellapi
procedure TForm1.Button1Click(Sender:
TObject);
var Mail : String;
begin
Mail := ‘mailto:lloydsoft@ieg.com.br’;
ShellExecute(GetDesktopWindow,‘open’,pchar
(Mail),nil,nil,sw_ShowNormal);
end;
217 - Imprimir em impressora
matricial em modo caracter via
Rede
// Esta rotina lê todas as impressoras instaladas no
windows
// e coloca dentro de um ComboBox e não se esqueça
de adicionar
// na cláusula uses a unit Printers
procedure TForm1.FormShow(Sender:
TObject);
var I : Integer;
begin
ComboBox1.Items.Clear;
For I:= 1 to Printer.Printers.Count do
Begin
if Pos(‘LPT’, printer.Printers.Strings[I-
1]) > 0Then
ComboBox1.Items.Add(‘LPT1’)
Else if Pos(‘\’,
printer.Printers.Strings[I-1]) > 0 Then
ComboBox1.Items.Add(Copy(printer.Printers.
Strings[I-1],
Pos(‘\’, printer.Printers.Strings[I-1]),
length(printer.Printers.Strings[I-1]) -
Pos(‘\’, printer.Printers.Strings[I-1]) +
1));
End;
End;
// e quando apertar o botao imprimir, o
evento pega qual a impressora
// que você escolheu atravéz do ComboBox e
Imprimi.
procedure TForm1.btImprimirClick(Sender:
TObject);
var I:Integer;
Arquivo : TextFile;
begin
AssignFile(Arquivo,ComboBox1.Value);
Rewrite(Arquivo);
WriteLn(Arquivo, ‘TESTE DE IMPRESSAO -
1’);
WriteLn(Arquivo, ‘TESTE DE IMPRESSAO -
2’);
WriteLn(Arquivo, ‘TESTE DE IMPRESSAO -
3’);
WriteLn(Arquivo, ‘TESTE DE IMPRESSAO -
4’);
CloseFile(Arquivo);
end;
218 - Link para WEB
Um procedure para você clicar no (label, menu, botão…)
a automaticamente abrir seu navegador padrão e
carregar a página determinada pelo link.
1º Declare o procedure na seção PUBLIC da unit.
procedure JumpTo(const aAdress: String);
2º Coloque a cláusula ShellAPI na uses no início da unit.
procedure TForm1.JumpTo(const aAdress:
String);
var
buffer: String;
begin
buffer := ‘http://’ + aAdress;
ShellExecute(Application.Handle, nil,
PChar(buffer), nil, nil, SW_SHOWNORMAL);
end;
procedure TForm1.Label1Click(Sender:
TObject);
begin
JumpTo(‘www.lloydsoft.hpg.ig.com.br’);
end;
219 - Configurar o Delphi para
acessar tabelas do Acess
Execute o BDE, abra a paleta CONFIGURATION, click
em Drivers, Native, MsAccess, uma janela de
configuração com várias opções será aberta. Configure
a DLL32 para IDDA032.DLL ACESS 95 ou
IDDA3532.DLL ACESS 97. Na opção SYSTEM
DATABASE, aponte para o arquivo System.mdw do
Acess que geralmente está no subdiretório
\Msoffice\Access. Salve a configuração e após isto é só
criar seu alias (se já houver algum criado, delete e
configure de novo). Com essa informação em mãos,
faça o programa não pedir o prompt de login (a da
senha), colocando um TDatabase no projeto. Escolha o
alias que você criou na propriedade AliasName. Altere
LoginPrompt para False. Na propriedade
DatabaseName, coloque um nome qualquer (servirá
como substituto do alias em todas as TTable e TQuery
que acessem esse BD). Altere a propriedade AliasName
de todas as TTables e TQueries que acessem essas
tabelas para o nome que você definiu em
DatabaseName no TDatabase.
220 - Emular o pressionamento de
uma tecla
keybd_event(65,0,0,0);
Será enviado o ‘A’ para o componente que estiver em
foco.
221 - Procurar arquivos
procedure TForm1.DirList( ASource :
string; ADirList : TStringList );
var
SearchRec : TSearchRec;
Result : integer;
begin
Result := FindFirst( ASource, faAnyFile,
SearchRec );
if Result = 0 then
while (Result = 0) do
begin
if (SearchRec.Name+’ ‘)[1] = ‘.’ then
{ Se pegou nome de SubDiretorio }
begin
Result := FindNext( SearchRec );
Continue;
end;
ADirList.Add( SearchRec.Name );
Result := FindNext( SearchRec );
end;
FindClose( SearchRec );
ADirList.Sort;
end;
Utilize a função assim:
procedure TForm1.Button1Click(Sender:
TObject);
var
contador: Integer;
lista: TStringlist;
begin
lista:= TStringlist.create;
DirList(‘C:\*.*’, lista);
end;
222 - Ligar/desligar a tecla Caps
Lock
Inclua na seção uses: Windows
{ Esta função liga/desliga Caps Lock, conforme o
parãmetro State }
procedure tbSetCapsLock(State: boolean);
begin
if (State and ((GetKeyState(VK_CAPITAL)
and 1) = 0)) or
((not State) and
((GetKeyState(VK_CAPITAL) and 1) = 1))
then
begin
keybd_event(VK_CAPITAL, $45,
KEYEVENTF_EXTENDEDKEY or 0, 0);
keybd_event(VK_CAPITAL, $45,
KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,
0);
end;
end;
{ Exemplos de uso: }
tbSetCapsLock(true); { Liga Caps Lock }
tbSetCapsLock(false); { Desliga Caps Lock
}
Observações
Aparentemente, podemos usar esta mesma técnica para
ligar/desligar Num Lock. Neste caso trocaríamos
VK_CAPITAL por VK_NUMLOCK. Por incrível que
pareça não funcionou (pelo menos no teste que fiz). E
tem mais: isto está na documentação do (R)Windows.
223 - Verificar se uma determinada
tecla está pressionada
Inclua na seção uses: Windows
{ Esta função retorna true se a tecla informada estiver
pressionada. False em caso contrário. }
{ Exemplos de uso: }
if tbKeyIsDown(VK_CONTROL) then
{ Tecla Ctrl pressionada }
if tbKeyIsDown(VK_MENU) then
{ Tecla Alt pressionada }
if tbKeyIsDown(VK_SHIFT) then
{ Tecla Shift pressionada }
if tbKeyIsDown(VK_F2) then
{ Tecla F2 pressionada }
Observações
Qualquer tecla pode ser verificada. Para isto basta saber
o código virtual (Virtual Key Code) da tecla.
224 - Fazer pesquisa incremental
Prob.: Gostaria de montar um formulário de pesquisa
com um DBGrid e um Edit de modo que, enquanto o
usuário digita um nome do Edit, o registro vai sendo
localizado no DBGrid. Como fazer?
- Crie um índice na tabela com campo a ser usado na
pesquisa.
Coloque no Form:
- Um DataSource
- Um Table
- Um DBGrid
- Um Edit
Altere as seguintes propriedades:
- DataSource1.DataSet = Table1
- Table1.DatabaseName = ‘NomeDoAlias’
- Table1.TableName = ‘NomeDaTabela’
- Table1.IndexFieldNames = ‘NomeDoCampo’
- Table1.Active = true
- DBGrid1.DataSource = DataSource1
Escreva a instrução abaixo no evento OnChange do
Edit:
Table1.FindNearest([Edit1.Text]);
Observações
Este exemplo considera que o campo seja tipo string.
Para outros tipos de campos pode ocorrer erro
dependendo dos valores digitados no Edit1.
225 - Implementar rotinas
assembly em Pascal
{ O Delphi permite a implementação de rotinas assembly
mescladas ao código Pascal. Não entrarei em detalhes
minuciosos, mas darei alguns exemplos básicos de
como implementar rotinas simples que retornam
números inteiros.}
interface
uses SysUtils;
implementation
end.
231 - Retorna a quantidade de dias
uteis entre duas datas
function
DifDateUtil(dataini,datafin:string):intege
r;
var a,b,c:tdatetime;
ct,s:integer;
begin
if StrToDate(DataFin) < StrtoDate(DataIni)
then
begin
Result := 0;
exit;
end;
ct := 0;
s := 1;
a := strtodate(dataFin);
b := strtodate(dataIni);
if a > b then
begin
c := a;
a := b;
b := c;
s := 1;
end;
a := a + 1;
while (dayofweek(a)<>2) and (a <= b) do
begin
if dayofweek(a) in [2..6] then
begin
inc(ct);
end;
a := a + 1;
end;
ct := ct + round((5*int((b-a)/7)));
a := a + (7*int((b-a)/7));
while a <= b do
begin
if dayofweek(a) in [2..6] then
begin
inc(ct);
end;
a := a + 1;
end;
if ct < 0 then
begin
ct := 0;
end;
result := s*ct;
end;
232 - Como registrar um OCX
Digite “Regsvr.exe do OCX>” ou “Regsvr32.exe do
OCX>”
233 - Como usar recursos do word
uses
ComObj, ActiveX;
var
OldWord, NewWord: Variant;
procedure TForm1.FormCreate(Sender:
TObject);
begin
OldWord := GetOrCreateObject
(‘Word.Basic’);
NewWord := GetOrCreateObject
(‘Word.Application’);
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
OldWord.FileNew;//criar um arquivo novo
OldWord.AppShow; //chamar a aplicação
OldWord.Insert (‘Mastering Delphi by
Pacal Votan’); //inserir o texto
end;
procedure TForm1.Button2Click(Sender:
TObject);
var
Document, Range: Variant;
begin
NewWord.Visible := True;
NewWord.Documents.Add;
// inserir texto
NewWord.Documents.Item(1).Range.
Text := ‘Mastering Delphi by Pacal
Votan’;
// get document and add paragraph
Document := NewWord.Documents.Item(1);
Document.Paragraphs.Add;
Document.Paragraphs.Add;
// selecionar o terceiro parqagrafo
Range :=
Document.Paragraphs.Item(3).Range;
Range.Text := ‘Hello, Delphi’;
Range.Bold := 1;
Range.Font.Size := 30;
// salvar o arquivo gerado
if SaveDialog1.Execute then
Document.SaveAs (WideString
(SaveDialog1.Filename), 0);
Document.SaveAs (FileName := WideString
(SaveDialog1.Filename),
FileFormat := 0, //formato nativo do
word
SaveNativePictureFormat := 1); // true
end;
234 - Bloqueio de palavras
use a função Pos.
sAux:=‘Nós usamos delphi!’;
if Pos(‘delphi’,sAux)>0 then
{faça alguma coisa};
235 - Esconder o icone da Barra de
Tarefas
//Insira estas linhas no onShow do seu
Aplicativo para que ele fique invisível
//na barra do menu Iniciar:
var
H : HWnd;
begin
H := FindWindow(Nil,‘Project1’); {troque
project1 pelo nome do seu projeto)
if H <> 0 then ShowWindow(H,SW_HIDE);
end;
236 - Texto Rotativo
procedure AngleTextOut(CV: TCanvas; const
sText: String; x, y, angle:integer);
var
LogFont: TLogFont;
SaveFont: TFont;
begin
SaveFont := TFont.Create;
SaveFont.Assign(CV.Font);
GetObject(SaveFont.Handle,
sizeof(TLogFont), @LogFont);
with LogFont do
begin
lfEscapement := angle *10;
lfPitchAndFamily := FIXED_PITCH or
FF_DONTCARE;
end; {with}
CV.Font.Handle :=
CreateFontIndirect(LogFont);
SetBkMode(CV.Handle, TRANSPARENT);
CV.TextOut(x, y, sText);
CV.Font.Assign(SaveFont);
SaveFont.Free;
end;
237 - Enviando caracteres para
outra aplicação
var
myHandle : THandle;
begin
myHandle:= FindWindow( ‘MyAppClass’,
‘MyAppCaption’);
if myHandle <> 0 then
PostMessage( myHandle, WM_KeyDown,
myCharCode, 0 );
end;
238 - Limitando a região de
movimentação do mouse
Inclua na seção uses: Windows
Coloque um botão no form e altera o evento OnClick
dele conforme abaixo:
procedure TForm1.Button1Click(Sender:
TObject);
var
R: TRect;
begin
{ Pega o retângulo da área cliente do
form }
R := GetClientRect;
{ Converte as coordenadas do form em
coordenadas da tela }
R.TopLeft := ClientToScreen(R.TopLeft);
R.BottomRight :=
ClientToScreen(R.BottomRight);
{ Limita a região de movimentação do
mouse }
ClipCursor(@R);
ShowMessage(‘Tente mover o mouse para
fora da área cliente do Form’);
{ Libera a movimentação }
ClipCursor(nil);
end;
239 - Executar Internet Explorer
uses comobj;
procedure TForm1.logoClick(Sender:
TObject);
var ie : Variant;
begin
IE :=
CreateOleObject(‘InternetExplorer.Applicat
ion’);
IE.Visible := true;
IE.Navigate(‘www.lloydsoft.hpg.ig.com.br’
);
end;
240 - Enviar um email
smtp.postmessage.toAddress := ‘StringList
(por ex uma listbox’;
smtp.postmessage.FromAdreess := ‘ex:
meu_email@123.pt’;
smtp.userid := ‘ex: user@123.pt’
smtp.host := ‘ex: smtp@123.pt’
smtp.postmessage.subject := ‘Assunto’
smtp.postmessage.body := ‘Texto da
mensagem (stringlist)’
smtp.connect;
smtp.sendmail;
smtp.disconnect;
Contribuição:
O Anonymous.nick enviou um complemento explicando
melhor o procedimento para enviar um e-mail usando o
Delphi.
Fazer um aplicativo completo para manipulação de e-
mails é um tanto trabalhoso e não é o assunto desta
dica. Muitas vezes, porém, queremos apenas dar ao
nosso software a capacidade de enviar simples e-mails.
Isto é fácil, especialmente porque o Delphi5 nos oferece
o componente TNMSMTP (paleta FastNet) que faz
praticamente todo o trabalho para nós. Precisamos
apenas alterar algumas propriedades e chamar alguns
métodos para que a mensagem seja enviada. Vamos
para a prática:
1. Coloque um componente TNMSMTP no form.
2. Coloque um botão e no evento OnClick deste botão
escreva:
procedure TForm1.Button1Click(Sender:
TObject);
begin
{ Conecta ao servidor }
NMSMTP1.Connect;
{ Se ocorrer algum erro durante a
conexão com o servidor, avise! }
if not NMSMTP1.Connected then
raise Exception.Create(‘Erro de
conexão’);
{ Seu nome }
FromName := ‘Meu Nome’;
{ E-mail do destinatário }
ToAddress.Clear;
ToAddress.Add(‘destinatario@servidor.com.b
r’);
{ Assunto da mensagem }
Subject := ‘Assunto da mensagem’;
{ Corpo da mensagem }
Body.Clear;
Body.Add(‘Primeira linha da mensagem’);
Body.Add(‘Segunda linha da mensagem’);
Body.Add(”); { Linha em branco }
Body.Add(‘Última linha da mensagem’);
Attachments.Clear;
{ Endereço do anexo }
Attachments.Add(‘c:\diretorio\arquivo.ext’
);
end;
{ Manda o e-mail }
NMSMTP1.SendMail;
{ Disconecta do servidor }
NMSMTP1.Disconnect;
end;
begin
dc:=getdc(getdesktopwindow);
try
desktopcanvas:=tcanvas.create;
bitmap:=tbitmap.create;
jpg:=tjpegimage.create;
try
bitmap.Width:=320;
bitmap.Height:=240;
desktopcanvas.handle:=dc;
desktoprect:=rect(0,0,319,239);
bitmap.canvas.CopyRect(desktoprect,deskto
pcanvas,desktoprect);
img.Picture.Bitmap:=bitmap;
with jpg do
begin
compressionquality:=25;
assign(bitmap);
compress;
savetofile(‘data'+filename);
end;
finally
bitmap.free;
desktopcanvas.free;
end;
finally
releasedc(getdesktopwindow,dc);
end;
end;
243 - String Grid Colorido
unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure StringGrid1DrawCell(Sender:
TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
procedure FormClose(Sender: TObject; var
Action: TCloseAction);
procedure StringGrid1DblClick(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
var
C, R: Integer;
Value: Integer;
begin
{Encher o String Grid de valores
Inteiros e Ramdomicos}
Randomize;
for C := 1 to StringGrid1.ColCount-1 do
for R := 1 to StringGrid1.RowCount-1 do
begin
Value := Random(10) - 5;
StringGrid1.Cells[C,R] :=
IntToStr(Value);
StringGrid1.Objects[C,R] :=
Pointer(clBlack);
end;
end;
procedure
TForm1.StringGrid1DrawCell(Sender:
TObject; Col, Row: Longint;
Rect: TRect; State: TGridDrawState);
const
LM = 3; {each indiviual cell’s left
margin}
TM = 2; {each indiviual cell’s top
margin}
var
ptr: Pointer;
begin
{qualquer cor é armazenada no ponteiro
do objeto}
ptr := StringGrid1.Objects[Col, Row];
StringGrid1.Canvas.Font.Color :=
LongInt(ptr);
{deixe as filas fixas e as colunas fixas
em prata }
if gdFixed in State then
StringGrid1.Canvas.Brush.Color :=
clSilver;
{puxemos o destaque do modo seguinte
quando a celula for selecionada }
if gdSelected in State then
begin
StringGrid1.Canvas.Brush.Color :=
clHighlight;
StringGrid1.Canvas.Font.Color :=
clHighlightText;
end;
{finalmente, faça o desenho de celula
atual }
StringGrid1.Canvas.TextRect(Rect,
Rect.Left + LM, Rect.Top + TM,
StringGrid1.Cells[col,row]);
end;
procedure TForm1.FormClose(Sender:
TObject; var Action: TCloseAction);
var
C, R: Integer;
begin
for C := 1 to StringGrid1.ColCount-1 do
for R := 1 to StringGrid1.RowCount-1 do
begin
{faça os objetos de todos o grid apontar
a nada }
StringGrid1.Objects[C, R] := nil;
{se nós tivéssemos armazenado objetos no
grid, nós deveríamos os livrar assim:
StringGrid1.Objects[C, R].Free;}
end;
end;
procedure
TForm1.StringGrid1DblClick(Sender:
TObject);
begin
With StringGrid1 do
Case Random(4) of
0 : Objects[Col,Row] := Pointer(clRed);
1 : Objects[Col,Row] := Pointer(clLime);
2 : Objects[Col,Row] := Pointer(clBlue);
3 : Objects[Col,Row] :=
Pointer(clFuchsia);
end;
end;
end.
244 - Utilizar o MessageBox com
parâmetros
var
Button: Integer;
Mensagem1 : Array[0..79] of Char;
Mensagem2 : Array[0..79] of Char;
begin
StrPCopy(Mensagem1, Edit1.Text + ‘ ‘ +
Edit2.Text);
StrPCopy(Mensagem2, Edit3.Text + ‘ ‘ +
Edit4.Text);
Button := Application.MessageBox
(Mensagem2,Mensagem1, MB_YESNOCANCEL+
mb_DefButton1+MB_ICONQUESTION);
end;
245 - Cor em DbGrid
Coloque a propriedade defaultdrawdata do dbgrid em
FALSE
No evento onDrawColumnCell do seu grid coloque o
seguinte:
procedure
TForm1.DBGrid1DrawColumnCell(Sender:
TObject;
const Rect: TRect; DataCol: Integer;
Column: TColumn;
State: TGridDrawState);
begin
If table1PRAZO.Value > DATE then //
condição
Dbgrid1.Canvas.Font.Color:= clFuchsia; //
coloque aqui a cor desejada
Dbgrid1.DefaultDrawDataCell(Rect,
dbgrid1.columns[datacol].field, State);
end;
246 - Todos os programas que
estão em execução
01) Programas Abertos
Function EnumWindowsProc (Wnd: HWND; lb:
TListbox): BOOL; stdcall;
var caption: Array [0..128] of Char;
begin
Result := True;
if IsWindowVisible(Wnd) and
((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0)
or
(HWND(GetWindowLong(Wnd, GWL_HWNDPARENT))
= GetDesktopWindow))and
((GetWindowLong(Wnd, GWL_EXSTYLE) and
WS_EX_TOOLWINDOW) = 0)
then
begin
SendMessage( Wnd, WM_GETTEXT,
Sizeof(caption),integer(@caption));
lb.Items.AddObject( caption,TObject( Wnd
));
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
EnumWindows( @EnumWindowsProc, integer(
listbox1 ));
end;
02) Programas Abertos (incluíndo os
ocultos)
Para listar (pegar) todas janelas abertas, deve-se usar a
funcao da API EnumWindows, que usa uma funcao
Callback, com dois parametros, um Handle para a janela
e um ponteiro. Voce pode usá-la com um códi-go
semelhante a este (Este lista as janelas abertas, mesmo
invisí-veis, em uma listbox):
procedure TForm1.Button1Click(Sender:
TObject);
begin
EnumWindows(@EnumWindowsProc,LongInt(Self)
);
end;
247 - Evitando o erro de Key
Violation
A dica abaixo apresenta o código para evitar que o
programa pare e envie uma mensagem padrão de erro
por Key Violation (Chave Primária).
Para isto, o código deve ser inserido no evento
OnPostError do componente de banco de dados (Table
ou Query).
Toda vez que ocorrer um erro de gravação no banco de
dados este evento será executado, sendo que na
variável de parâmetro “E” deste procedimento é
armazenado a mensagem que será apresentada na tela.
No caso de Key Violation a mensagem é exatamente
esta: “Key violation.”.
Para realizar um tratamento deste erro, testa-se se a
mensagem ocorrida é “Key violation.’, se for verdadeiro
o processo de gravação é abortado (Action := daAbort).
Código Completo:
Procedure TForm1.Table1PostError(DataSet:
TDataSet; E: EDatabaseError;var Action:
TDataAction);
Var
ErroMens :String;
begin
ErroMens := E.Message;
if ErroMens = ‘Key violation.’ then begin
ShowMessage(‘Chave Primária Inválida !’);
action := daAbort;
end;
end;
248 - Conferindo se o processador
da máquina é 386, 486 ou Pentium
Comentário :
A função abaixo implementa uma rotina que através da
função GetSystemInfo retorna se o processador
instalado na sua máquina é um 386, 486 ou Pentium.
Se o seu processador não for nenhum destes
apontados, a função retorna que seu processador é
desconhecido.
Obs: Para ver o resultado desta rotina, ponha um
componente Button no formulário, dê um duplo clique no
mesmo e insira o código descrito abaixo da função.
Código Completo:
function Info: String;var SysInfo:
TSystemInfo;
begin
GetSystemInfo(SysInfo);
case SysInfo.dwProcessorType of
386 : result := ‘Processador 80386’;
486 : result := ‘Processador 80486’;
586 : result := ‘Processador Pentium’;
else
result := Format(‘Processado desconhecido
(%d)’, [SysInfo.dwProcessorType]);
end;
end;
Como Usar:
procedure TForm1.Button1Click(Sender:
TObject);
begin
Showmessage(‘Nesta máquina temos :’+
Info);
end;
249 - Apagar um subdiretório
Inclua a unit SHELLAPI na clausula uses do seu form.
procedure TForm1.Button1Click(Sender:
TObject);
begin
DeleteDir( Self.Handle,‘C:\TESTE’);
end;
250 - Abrir arquivos com aplicativo
associado
Inclua a unit SHELLAPI na clausula uses do seu form.
procedure TForm1.Button1Click(Sender:
TObject);
begin
ExecFile(‘c:\windows\ladrilhos.bmp’);
end;
251 - Inserindo uma Imagem no
Formulário
A dica abaixo apresenta o código para implementação
da função para inserir uma imagem no fundo do
formulário.
A função permite que se especifique as coordenadas da
imagem e qual o arquivo que contém a imagem.
Através do componente TBitMap é possível criar uma
figura dinamicamente e especificar qual será a imagem,
através do método LoadFromFile.
Para desenhar a imagem usa-se o componente
Tcanvas, através do método Draw, que desenha um
gráfico nas coordenadas especificadas.
Código Completo:
declara após o type junto aos outros procedimentos!
Procedure
Desenha(figura:String;H,V:Integer);
Procedure
TForm1.Desenha(figura:String;H,V:Integer);
Var
Imagem :TBitMap;
begin
Imagem := TBitMap.Create;
Try
Imagem.LoadFromFile(Figura);
Canvas.Draw(H,V,Imagem);
Except
ShowMessage(‘ Arquivo não foi localizado
!’);
end;
end;
ExemploQuando o botão for clicado, uma imagem será
inserida no formulário, nas coordenadas (10,20);
procedure TForm1.Button1Click(Sender:
TObject);
begin
Desenha(‘c:\windows\bolhas.bmp’,10,20);
end;
252 - Número de cores suportadas
pelo seu Monitor
A dica abaixo apresenta o código para implementação
de uma função que retorne o número de cores
suportadas pelo monitor.
A função se baseia na utilização de uma API do
Windows, chamada GETDC.
A função GETDC deve ser seguida sempre da função
ReleaseDC , a fim de restaurar as características da
propriedade selecionada.
Através da função GETDC é possível definir quais as
características de contexto do monitor que desejamos
manipular, no caso abaixo, define-se a característica de
resolução.( GETDC(0) ).
Código Completo:
Function QdeCores : integer;var h : HDC;
begin
Result := 0; try h := GetDC( 0 );
Result :=1 shl ( GetDeviceCaps( h, PLANES
) * GetDeviceCaps( h, BITSPIXEL ));
finally
ReleaseDC( 0, h );
end;
end;
253 - Verificando se uma
determinada fonte esta instalada
A função abaixo implementa uma rotina para testar se
determinada fonte esta instalada no windows.
Para evitar que a fonte a ser testada seja escrita com
espaços em branco indevidos, usa-se a função Trim
para retirar os espaços em branco.
Código Completo:
Function
FonteExiste(Fonte:STring):Boolean;
begin
with Screen.Fonts do
Result := IndexOf(Trim(Fonte)) > 0;
end;
Exemplo:
Procedure
TForm1.Button1Click(Sender:Tobject);
begin
If FonteExiste(‘Times New Roman’) then
ShowMessage(‘ Fonte já existe !’) Else
ShowMessage(‘ Fonte Inexistente !’);
end;
254 - Listando os campos da tabela
num Memo
A implementação da função abaixo permite inserir os
campos de uma tabela num componente TMemo.
Para que a função funcione é necessário que as units
StdCtrls e DbTables tenham sido declaradas.
Os campos que serão listados, são aqueles que foram
declarados através da operação de duplo clique no
componente Table e opção ADD Fields.
Código Completo:
Procedure ListaCampos(TB:Ttable;M:Tmemo);
Begin
M.Lines.Assign(TB.ListField);
End;
Exemplo:
Procedure
TForm1.Button1Click(Sender:TObject);
Begin
ListaCampos(Table1,Memo1);
end;
255 - Imprimindo o conteúdo de um
Memo
// Adicione a Unit Printers na cláusula do
seu Form
uses Printers;
interface
implementation
function GetPort(address:word):word;
var
bValue: byte;
begin
asm
mov dx, address
in al, dx
mov bValue, al
end;
GetPort := bValue;
end;
procedure Sound(Freq : Word);
var
B : Byte;
Value: Word;
begin
if Freq > 18 then
begin
Freq := Word(1193181 div LongInt(Freq));
B := Byte(GetPort($61));
if (B and 3) = 0 then
begin
SetPort($61, Word(B or 3));
SetPort($43, $B6);
end;
SetPort($42, Freq);
SetPort($42, Freq shr 8);
end
else
begin
Value := GetPort($61) and $FC;
SetPort($61, Value);
end;
end;
end.
258 - Apagando todos os registros
da tabela
Para apagar os registros de uma tabela utiliza-se a
função delete.
Através de um comando de repetição (While) é possível
excluir todos os registros da tabela, usando como flag a
quantidade de registros existentes na tabela
(RecordCount > 0).
Código Completo:
Procedure ApagarTodosReg(Origem:TDataSet);
Begin
With Origem do
While RecordCount > 0 do
Delete;
End;
Como Usar:
ApagarTodosReg(Table1);
ou ApagarTodosReg(Query1);
259 - Como desenhar um Bitmap
num form
var
Form1: TForm1;
Bmp: TBitmap;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
begin
Bmp:=TBitmap.Create;
Bmp.Loadfromfile(‘c:\windows\nuvens.bmp’);
end;
procedure TForm1.TForm1.FormPaint(Sender:
TObject);
begin
Canvas.Draw(50,50,Bmp);
end;
procedure TForm1.FormClose(Sender:
TObject; var Action: TCloseAction);
begin
Bmp.Free;
end;
260 - Evitando caracteres com
acento
A função abaixo pega um string informada como
parâmetro e retira todas as letras acentuadas
substituindo-as por letras correspondentes sem acento.
function AnsiToAscii ( str: String ):
String;
var
i: Integer;
begin
for i := 1 to Length ( str ) do
case str[i] of
‘á’: str[i] := ‘a’;
‘é’: str[i] := ‘e’;
‘í’: str[i] := ‘i’;
‘ó’: str[i] := ‘o’;
‘ú’: str[i] := ‘u’;
‘à’: str[i] := ‘a’;
‘è’: str[i] := ‘e’;
‘ì’: str[i] := ‘i’;
‘ò’: str[i] := ‘o’;
‘ù’: str[i] := ‘u’;
‘â’: str[i] := ‘a’;
‘ê’: str[i] := ‘e’;
‘î’: str[i] := ‘i’;
‘ô’: str[i] := ‘o’;
‘û’: str[i] := ‘u’;
‘ä’: str[i] := ‘a’;
‘ë’: str[i] := ‘e’;
‘ï’: str[i] := ‘i’;
‘ö’: str[i] := ‘o’;
‘ü’: str[i] := ‘u’;
‘ã’: str[i] := ‘a’;
‘õ’: str[i] := ‘o’;
‘ñ’: str[i] := ‘n’;
‘ç’: str[i] := ‘c’;
‘Á’: str[i] := ‘A’;
‘É’: str[i] := ‘E’;
‘Í’: str[i] := ‘I’;
‘Ó’: str[i] := ‘O’;
‘Ú’: str[i] := ‘U’;
‘À’: str[i] := ‘A’;
‘È’: str[i] := ‘E’;
‘Ì’: str[i] := ‘I’;
‘Ò’: str[i] := ‘O’;
‘Ù’: str[i] := ‘U’;
‘Â’: str[i] := ‘A’;
‘Ê’: str[i] := ‘E’;
‘Î’: str[i] := ‘I’;
‘Ô’: str[i] := ‘O’;
‘Û’: str[i] := ‘U’;
‘Ä’: str[i] := ‘A’;
‘Ë’: str[i] := ‘E’;
‘Ï’: str[i] := ‘I’;
‘Ö’: str[i] := ‘O’;
‘Ü’: str[i] := ‘U’;
‘Ã’: str[i] := ‘A’;
‘Õ’: str[i] := ‘O’;
‘Ñ’: str[i] := ‘N’;
‘Ç’: str[i] := ‘C’;
end;
Result := str;
end;
261 - Executando uma chamada
para a Conexão Dial-Up
Executando uma chamada para a Conexão Dial-Up
Insira um objeto do tipo Button definindo sua
propriedade name para Button1.
implementation
uses Registry;
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
Var
Conexao, Executa, Conecta : string;
Dialup : Pchar;
reg : TRegIniFile;
begin
reg :=
TRegIniFile.create(‘RemoteAccess');
Conexao :=
reg.ReadString(”,‘Default’,”);
reg.free;
Executa:=‘rundll32.exe rnaui.dll,RnaDial
‘; {executavel e biblioteca do windows}
Conecta:=Executa+Conexao; {concatena
comando e nome da conexão}
Dialup:=Pchar(Conecta); {transforma
string em caracter para ser aceita pela
função}
winexec(Dialup,sw_show);
end;
262 - Capturar informações do
ambiente DOS
No exemplo abaixo deve ser incluído no objeto TForm
um objeto do tipo Button, um objeto do tipo StringGrid e
um objeto do tipo ListBox.
type
TForm1 = class(TForm)
ListBox1: TListBox;
Button1: TButton;
StringGrid1: TStringGrid;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
++Facil
SetForegroundWindow(handle);
265 - Form com um furo da pra ve
atraz
var
Region, Region2 : hrgn;
begin
Form1.FormStyle:= fsStayOnTop;
Region :=
CreaterectRgn(0,0,width,height);
Region2 :=
CreateEllipticRgn(30,30,100,100);
CombineRgn(region, region, region2,
RGN_DIFF);
SetWindowRgn(handle, region, true);
end;
266 - Abrir as configurações do
Vídeo do Painel de Controle
WinExec(‘RunDLL32.exe
Shell32.DLL,Control_RunDLL Desk.cpl’,
SW_Show)
Os outros itens do Painel de Controle podem ser
acessados mudando-se o nome do arquivo .cpl,
exemplo:
- Modem.cpl
- Netcpl.cpl
267 - Simular o pressionamento de
uma combinação de teclas
ex: Ctrl+F2
Inclua na seção uses: Windows
{ Mantém pressionada CTRL }
keybd_event(VK_CONTROL, 0,
KEYEVENTF_EXTENDEDKEY or 0, 0);
{ Pressiona F2 }
keybd_event(VK_F2, 0, 0, 0);
No Oncreate do Form:
procedure TForm1.FormCreate(Sender:
TObject);
begin
NewImage:=TPicture.create;
NewImage.LoadFromFile(‘C:\Delphi3\Images\D
EFAULT\OutOpen.BMP’);
Iniciar :=
FindWindowEx(FindWindow(‘Shell_TrayWnd’,ni
l),0,‘Button’,nil);
OldBitmap:=SendMessage(Iniciar,BM_SetImage
,0,NewImage.Bitmap.Handle);
end;
No OnDestroy
procedure TForm1.FormDestroy(Sender:
TObject);
begin
SendMessage(Iniciar,BM_SetImage,0,OldBitma
p);
NewImage.Free;
end;
269 - Inverter os botões do mouse
Dica :
{ Para inverter: }
SwapMouseButton(true);
procedure TForm1.Button1Click(Sender:
TObject);
begin
ShowMessage(‘Button 1 clicked’);
end;
procedure TForm1.Button2Click(Sender:
TObject);
var
Pt : TPoint;
begin
Application.ProcessMessages;
{Obtém o point no centro do Button1}
Pt.x := Button1.Left + (Button1.Width div
2);
Pt.y := Button1.Top + (Button1.Height div
2);
{Converte Pt para as coordenadas da tela }
Pt := ClientToScreen(Pt);
Pt.x := Round(Pt.x * (65535 /
Screen.Width));
Pt.y := Round(Pt.y * (65535 /
Screen.Height));
{Move o mouse}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_MOVE, Pt.x, Pt.y, 0, 0);
{Simula o pressionamento do botão esquerdo
do mouse}
Mouse_Event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_LEFTDOWN, Pt.x, Pt.y, 0, 0);
{ Simula soltando o botão esquerdo do
mouse }
Mouse_Event(MOUSEEVENTF_ABSOLUTE or
MOUSEEVENTF_LEFTUP, Pt.x, Pt.y, 0, 0);
end;
271 - Executar algo antes de
minimizar
Primero, capturamos a menssagem, adicionando esta
linha na declaração private do form:
type
TForm1 = class(TForm)
private
{Esta linha}
procedure WMSysCommand(var Msg:
TWMSysCommand); message WM_SYSCOMMAND;
end;
Na implementation, colocamos a procedure:
procedure TForm1.WMSysCommand(var Msg:
TWMSysCommand);
begin
if (Msg.CmdType = SC_MINIMIZE) or
(Msg.CmdType = SC_MAXIMIZE) then
MessageBeep(0);
DefaultHandler(Msg);
end;
272 - Esconder icones do desktop
ShowWindow(FindWindow(nil,‘Program
Manager’),SW_HIDE);
Para mostrar :
ShowWindow(FindWindow(nil,‘Program
Manager’),SW_SHOW);
273 - Senha em tabelas
Senha em tabelas
Colocar componete session (Guia dataset)
sessio1.addpassword(‘senha’)
table1.active:= true
OBS: no databasedekstop programar a opcao password
security
274 - Rodar videos em um panel
begin
if opendialog1.execute then
begin
mediaplayer1.filename:=
opendialog1.filename;
mediaplayer1.open;
mediaplayer1.Perform
(wm_lbuttondown,0,$00090009);
mediaplayer1.Perform
(wm_lbuttonup,0,$00090009);
end;
end;
275 - Sql por campo edit
pesquisando pelo nome
query1.active := false;
query1.sql.clear;
query1.sql.add(‘select * from teste where
nome = ”’ + edit1.Text + ‘”’);
query1.active:= true;
276 - Sql relacionada com a
primeira letra
query1.active := false;
query1.sql.clear;
query1.sql.add(‘select * from estrucpr
where upper(portugues)like “LETRA%” ‘);
query1.active:= true;
PRIMEIRA LETRA “LETRA%”
ULTIMA LETRA “%LETRA”
QUE CONTENHA A LETRA “%LETRA%”
277 - Fazer um campo memo ocupar
2 páginas
EVENTO : OnStartPage DA QUICKRAP
if frmpesquisa.DBMEMOProtResp.CanFocus >
QRDBRichText1.CanFocus then
QRDBRichText1.AutoStretch:= true ;
278 - Procura com mais de um
Banco de Dados
edit1.text:= dbcombobox1.Text;
QueryPrinc.active := false;
QueryPrinc.sql.clear;
QueryPrinc.sql.add(‘select * from estrucpr
where portugues = ”’ + edit1.Text + ‘”’);
QueryPrinc.active:= true;
if DBcodEl.text=DBcodEl.text then
edit2.Text:= DBcodEl.Text;
QuerySin.active := false;
QuerySin.sql.clear;
QuerySin.sql.add(‘ select * from sinonimo
where sin_est_id = ”’ + edit2.text + ‘
”’);
QuerySin.active:= true;
if DBcodEl.text=DBcodEl.text then
edit3.Text:= DBcodEl.Text;
QueryPropFis.active := false;
QueryPropFis.sql.clear;
QueryPropFis.sql.add(‘select * from
FIQU_PRO where fiqu_id = ”’ + edit3.Text +
‘”’);
QueryPropFis.active:= true;
279 - Senhas Aleatórias
procedure TForm1.Button1Click(Sender:
TObject);
var
i:integer;
const
str=‘1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ’
;
max=6;
begin
Edit1.Text:=”;
for i:=1 to max do
Edit1.Text:=Edit1.Text+str[random(length(s
tr))+1];
end;
end.
280 - Configurações internacionais
Normalmente o Delphi pega os formatos de data/hora,
moeda e formato numérico da Configuração
Internacional do Painel de Controle. Isto pode levar a
erros quando avaliando datas, numeros ou listas. Para
evitar estes erros, voce pode mudar as constantes
definidas no Delphi, como DecimalSeparator,
ShortDateFormat e outros desta maneira:
DecimalSeparator := ‘.’;
ShortDateFormat := ‘mm/dd/yy’;
Isto terá precedência sobre a configuração padrão. Para
uma lista completa das variáveis, procure em Currency
Formatting Variables na ajuda do Delphi.,
281 - Desenhando com tipos
diferentes de linhas
O Windows permite desenhar linhas onde cada pixel é
outro tipo de primitiva ou desenho com a função
LineDDA. Ela precisa de uma função “callback”, que
será chamada quando um pixel deve ser desenhado. Ali
podem ser postas as rotinas de desenho. A rotina a
seguir desenha um retângulo a cada 4 pixels:
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
public
DrawNow : Integer;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormPaint(Sender:
TObject);
begin
LineDDA(0,0,Width,Height,@DrawPoint,Intege
r(Self));
end;
end.
282 - Desabilitando o Splash
Screen do Report Smith
1 - Localize o arquivo RS_RUN.INI (no diretório do
Windows);
2 - Na seção [ReportSmith] inclua a linha seguinte:
ShowAboutBox=0
3 - Na seção [RS_RunTime] inclua a linha seguinte:
ShowAboutBox=0
4 - Não se esqueça de distribuir com o seu aplicativo o
referido arquivo INI.
283 - Verificar se o registro está
travado
Inclua a unit DBITYPES na clausula uses do seu form.
function TForm1.IsRecordLocked(Table: TTable;
ByAnyone: boolean): Boolean;
var
Locked: BOOL;
hCur: hDBICur;
rslt: DBIResult;
begin
Table.UpdateCursorPos;
// Is the record locked by the current
session…
Check(DbiIsRecordLocked(Table.Handle,
Locked));
Result := Locked;
// If the current session does not have a
lock and the ByAnyone varable is
// set to check all sessions, continue
check…
if (Result = False) and (ByAnyone = True)
then
begin
// Get a new cursor to the same record…
Check(DbiCloneCursor(Table.Handle, False,
False, hCur));
try
// Try and get the record with a write
lock…
rslt := DbiGetRecord(hCur, dbiWRITELOCK,
nil, nil);
if rslt <> DBIERR_NONE then
begin
// if an error occured and it is a lock
error, return true…
if HiByte(rslt) = ERRCAT_LOCKCONFLICT then
Result := True
else
// If some other error happened, throw an
exception…
Check(rslt);
end
else
// Release the lock in this session if the
function was successful…
Check(DbiRelRecordLock(hCur, False));
finally
// Close the cloned cursor…
Check(DbiCloseCursor(hCur));
end;
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
If IsRecordLocked(Table1,True) then
Showmessage(‘Registro Travado!’);
end;
284 - Cursor customizado
Criar um arquivo de recurso com o cursor (vamos
chamá-lo de teste.res)
Vamos chamar o recurso de CUR_1
Coloque {$R teste.res} na seção implementation
var
Form1: TForm1;
i : integer;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
begin
i := 0 ;
QuickRep1.Prepare;
QrLabel2.Caption := IntToStr(i);
QuickRep1.Preview;
end;
procedure
TForm1.QuickRep1StartPage(Sender:
TQuickRep);
begin
i := i + 1;
Form2.Label1.caption := IntToStr(i);
end;
290 - Como retornar a uma lista os
campos indexados de um tabela
procedure TForm1.Button1Click(Sender:
TObject);
var
i : integer;
begin
Table1.IndexDefs.Update;
ListBox1.Items.add
(‘******** Índice Primário ********’);
for i:=0 to Table1.IndexDefs.Count-1 do
begin
if Table1.IndexDefs.Items[i].Options =
[ixPrimary..ixUnique] then
ListBox1.Items.add(Table1.IndexDefs.Items[
I].Fields)
else
begin
ListBox1.Items.add(”);
ListBox1.Items.add
(‘**** Índice Secundário ****’);
Listbox1.Items.Add(Table1.IndexDefs.Items[
I].Name);
end;
end;
end;
291 - Como definir seu próprio
hotkey
Primeiro fixe a propriedade KeyPreview do Form para
TRUE
procedure TForm1.FormKeyDown(Sender:
TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (chr(Key) in
[‘A’, ‘a’]) then
ShowMessage(‘Ctrl-A’);
end;
292 - Transformando ícone (*.ico)
em bitmap (*.bmp)
VAR
Pic : TPicture;
TI : TIcon;
BEGIN
TI := TIcon.Create;
TI.Handle := ExtractIcon(HInstance,
FileNameBuf, 0);
Pic := TPicture.Create;
Pic.Icon := TI;
Image1.Picture := Pic; {TImage}
BitBtn1.Glyph := TBitmap.Create;
WITH BitBtn1.Glyph DO
BEGIN
width := TI.Width;
Height := TI.Height;
Canvas.Draw(0, 0, Pic.Icon);
END;
END;
293 - Transferindo o conteúdo de
um memo para um memofield
Var
t: TTable;
Begin
t := TTable.create(self);
with t do
begin
DatabaseName := ‘MyAlias’; {personal
alias}
TableName := ‘MyTbl.db’;
open;
edit;
insert;
fieldByName(‘TheField’).assign(memo1.lines
); {This is it!}
post; {required!!!}
close;
end;
end;
294 - Mudar o foco do campo em
um Dbgrid
Modificando o foco de um DBGrid
DBGrid1.SelectedIndex:=2; { Vai para a 3a
coluna }
295 - Como tirar os espaços no
início e no final de uma string
Function Trim(J:String):String; Export;
Begin
While J[Length(J)]=#32 do Dec(J[0]);
If Length(J)>1 then
While (J[1]=’ ‘) do
Begin
Delete(J,1,1);
If Length(J)<=1 then J:=”;
end;
Result:=J;
end;
296 - Como colocar uma coluna do
DBGrid em maiuscula
procedure TForm1.DBGrid1KeyPress(Sender:
TObject; var Key: Char);
begin
if DBGrid1.SelectedField.FieldName=‘NOME’
THEN
Key := AnsiUpperCase(Key)[Length(Key)];
end;
297 - Simular Print Screen
Uma coisa que pode ser muito útil em suporte a
distância, ou até mesmo pra outros objetivos, é a
realização de um “print-scrren” coisa que muitas vezes
um usuário não dá conta de realizar e fica complicado,
de certa maneira, explicar por telefone. Por este motivo
criamos uma rotininha que simula a tecla PrintScreen. A
baixo a rotina de como realizar tal processo:
procedure TForm1.Button1Click(Sender:
TObject);
begin
keybd_event(VK_PRINT, 0, 0, 0);
keybd_event(VK_PRINT, 0, KEYEVENT_KEYUP,
0);
end;
Uses
qrprntr
var
Form1: TForm1;
cPaperSize : TQRPaperSize;
nLength : Extended;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
begin
cPapersize := QuickRep1.Page.PaperSize;
nLength := QuickRep1.Page.Length;
QuickRep1.Preview;
end;
procedure
TForm1.QuickRep1BeforePrint(Sender:
TQuickRep;
var PrintReport: Boolean);
begin
QuickRep1.Page.PaperSize := cPaperSize;
QuickRep1.Page.Length := nLength;
end;
299 - Caption do BitBtn com várias
linhas
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;
type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
var
R : TRect;
N : Integer;
Buff : array[0..255] of Char;
begin
with BitBtn1 do
begin
Caption := ‘Várias linhas no caption de um
botão’;
Glyph.Canvas.Font := Self.Font;
Glyph.Width := Width - 6;
Glyph.Height := Height - 6;
R := Bounds(0, 0, Glyph.Width, 0);
StrPCopy(Buff, Caption);
Caption := ”;
DrawText(Glyph.Canvas.Handle,
Buff,StrLen(Buff),R,
DT_CENTER or DT_WORDBREAK or DT_CALCRECT);
OffsetRect(R,(Glyph.Width - R.Right) div
2,
(Glyph.Height - R.Bottom) div 2);
DrawText(Glyph.Canvas.Handle, Buff,
StrLen(Buff), R,
DT_CENTER or DT_WORDBREAK);
end;
end;
end.
300 - Alterar fonte do hint
Para testar este exemplo inclua no seu form alguns
componentes. Nestes componentes coloque
informações na propriedade Hint de cada componente e
altere a propriedade ShowHint para True.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure MyShowHint(var HintStr: string;
var CanShow: Boolean;
var HintInfo: THintInfo);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Exemplo:
Coloque este comando no evento de saida de
foco de um edit
Edit1.Text :=CaixaMista(Edit1.Text) ;
DIGITANDO ASSIM
JOSÉ JORNANDO DE CARVALHO JÚNIOR
Ficará Assim
José Jornando de Carvalho Júnior
303 - Justificar Texto
function
Justifica(mCad:string;mMAx:integer):string
;
var
mPos,mPont,mTam,mNr,mCont:integer;
mStr:string;
begin
mTam:=Length(mCad);
if mTam>=mMax then
Result:=copy(mCad,1,mMax)
else
mStr:=”;
mCont:=0;
mPont:=1;
mNr:=mMax-mTam;
while mCont<mNr do
begin
mPos:=pos(mStr,copy(mCad,mPont,100));
if mPos=0 then
begin
mStr:=mStr+’ ‘;
mPont:=1;
continue;
end
else
begin
mCont:=mCont+1;
Insert(‘ ‘,mCad,mPos+mPont);
mPont:=mPont+mPos+length(mStr);
end;
Result:=mCad;
end;
end;
EX.:
Memo1.lines[i]:=justifica(memo1.lines[i]
{String},60 {Nº de caracteres possiveis da
linha});
304 - Código gerador de senha
procedure TForm1.Button1Click(Sender:
TObject);
var
i:integer;
const
str=‘1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ’
;
max=6;
begin
Edit1.Text:=”;
for i:=1 to max do
Edit1.Text:=Edit1.Text+str[random(length(s
tr))+1];
end;
305 - Espaço maior no RichEdit
SendMessage(RichEdit1.Handle,
EM_EXLIMITTEXT, 0, $FFFFFF);
a depender da suar versão do delphi use
SendMessage(RichEdit1.Handle,
EM_LIMITTEXT, 0, $FFFFFF);
306 - Como criar novas tabela a
partir de consulta SQL
Para criar tabelas permanentes do resultado de uma
query faça o seguinte:
Query1.Open
DBIMakePermanent(Query1.Handle, ‘Nome-
Da-Tabela.db’, True);
Query1.Close;
Utilize BDE na Clausula USES para utilizar a função
DBIMakePermanent
307 - Código sequencial automático
Você manda o caminho (Alias “C:\Windows”), nome da
tabela (tabela.db) e o campo primário (código por ex) e
ele autoincrementa, se quiser usar formatação é só
colocar.
Function AutoIncrementoManual(Const
pAlias:String; pTabela:String;
pCampo:String):Integer;
var
vQry : tQuery;
int : integer;
begin
vQry := tQuery.Create(Application);
with vQry do begin
DatabaseName := pAlias;
SQL.Add(‘Select Max(‘ + pCampo +’) as
Proximo’);
SQL.Add(‘From ‘+ pTabela);
Open;
int:= FieldByName(‘Proximo’).asInteger +
1;
Result := int;
free;
end; {with vQry}
end;
308 - Encriptar/Desencriptar
strings
Esta função permite encriptar e desencriptar strings. O
código de encriptação é bastante simples, por isso pode
ser melhorado, sendo este apenas um exemplo de como
fazê-lo em Delphi.
function EnDecryptString(StrValue :
String; Chave: Word) : String;
var
I: Integer;
OutValue : String;
begin
OutValue := ”;
for I := 1 to Length(StrValue) do
OutValue := OutValue +
char(Not(ord(StrValue[I])-Chave));
Result := OutValue;
end;
Exemplo de utilização:
Iniciar um novo projecto, copiar a função para uma unit,
colocar três TEdit (Edit1, Edit2, Edit3) e dois TButton
(Button1 e Button2) na form.
No evento OnClick do Button1 deve chamar a função,
em que os parâmetros de entrada são o texto do Edit1 e
uma chave de encriptação do tipo word.
procedure TForm1.Button1Click(Sender:
TObject);
begin
Edit2.text:=EnDecryptString(Edit1.text,
236);
end;
No evento OnClick do Button2 deve chamar a função
EnDecryptString, em que os parâmetros de entrada são
o texto encriptado do Edit2 a chave de encriptação
usada para encriptar a string.
procedure TForm1.Button2Click(Sender:
TObject);
begin
Edit3.text:=EnDecryptString(Edit2.text,
236);
end;
2ª Dica
Função para criptografar uma
String
A função Criptografia pode ser usada para criptografar a
senha acesso ao sistema. Ela é usada nos dois
sentidos, para criptografar e descriptografar, desde que
seja usada a mesma chave nas duas operações. “mStr”
é a String que vai ser criptografada e “mChave” é a
String que sera usada como base para fazer a
criptografia.
function Criptografia(mStr, mChave:
string): string;
var
i, TamanhoString, pos, PosLetra,
TamanhoChave: Integer;
begin
Result := mStr;
TamanhoString := Length(mStr);
TamanhoChave := Length(mChave);
for i := 1 to TamanhoString do
begin
pos := (i mod TamanhoChave);
if pos = 0 then
pos := TamanhoChave;
posLetra := ord(Result[i]) xor
ord(mChave[pos]);
if posLetra = 0 then
posLetra := ord(Result[i]);
Result[i] := chr(posLetra);
end;
end;
3ª Dica
Encripitando uma string
program Crypt;
uses WinCRT;
const
C1 = 52845;
C2 = 22719;
function Encrypt(const S: string; Key:
Word): string;
var
I: byte;
begin
Result[0] := S[0];
for I := 1 to Length(S) do
begin
Result[I] := char(byte(S[I]) xor (Key shr
8));
Key := (byte(Result[I]) + Key) * C1 + C2;
end;
end;
function Decrypt(const S: string; Key:
Word): string;
var
I: byte;
begin
Result[0] := S[0];
for I := 1 to Length(S) do
begin
Result[I] := char(byte(S[I]) xor (Key shr
8));
Key := (byte(S[I]) + Key) * C1 + C2;
end;
end;
var
S: string;
begin
Write(‘>’);
ReadLn(S);
S := Encrypt(S, 12345);
WriteLn(S);
S := Decrypt(S, 12345);
WriteLn(S);
end.
Encripitando uma string (2)
function Encrypt( Senha:String ): String;
Const
Chave : String = ‘Jesus’;
Var
x,y : Integer;
NovaSenha : String;
begin
for x := 1 to Length( Chave ) do
begin
NovaSenha := ”;
for y := 1 to Length( Senha ) do
NovaSenha := NovaSenha + chr(
(Ord(Chave[x]) xor Ord(Senha[y])));
Senha := NovaSenha;
end;
result := Senha;
end;
309 - Encriptar/Desencriptar
arquivos
Este procedimento permite encriptar e desencriptar
arquivos de qualquer tipo. O código de encriptação é
bastante simples, por isso pode ser melhorado, sendo
este apenas um exemplo de como fazê-lo em Delphi.
procedure EnDecryptFile(INFName, OutFName
: String; Chave : Word);
var
InMS, OutMS : TMemoryStream;
I : Integer;
C : byte;
begin
InMS := TMemoryStream.Create;
OutMS := TMemoryStream.Create;
try
InMS.LoadFromFile(INFName);
InMS.Position := 0;
for I := 0 to InMS.Size - 1 do
begin
InMS.Read(C, 1);
C := (C xor not(ord(chave shr I)));
OutMS.Write(C,1);
end;
OutMS.SaveToFile(OutFName);
finally
InMS.Free;
OutMS.Free;
end;
end;
Exemplo de utilização:
Iniciar um novo projecto, copiar o procedimento
EnDecryptFile para uma unit, colocar dois TButton
(Button1 e Button2) na form.
No evento OnClick do Button1 deve chamar o
procedimento, em que os parâmetros são o a path do
arquivo a encriptar, a path para onde o arquivo deve ser
encriptado e uma chave de encriptação.
procedure TForm1.Button1Click(Sender:
TObject);
begin
EnDecryptFile(‘c:\arquivo.txt’,
‘c:\arquivo1.txt’, 12);
end;
No evento OnClick do Button2 deve chamar o
procedimento, em que os parâmetros são o a path e o
nome do arquivo encriptado, a path e o nome para onde
o arquivo deve ser desencriptado e a chave de
encriptação usada para encriptar o arquivo original.
procedure TForm1.Button2Click(Sender:
TObject);
begin
EnDecryptFile(‘c:\ficheiro1.txt’,
‘c:\ficheiro2.txt’, 12);
end;
Agora verifique se o arquivo c:\arquivo.txt é igual ao
arquivo c:\arquivo2.txt, se é então correu tudo bem!
310 - Colocar os bitmaps na dll
Por vezes, quando iniciamos um projecto, temos uma
preocupação: fazer uma aplicação pequena. Bem, a
solução pode passar por colocar todos os bitmaps que
vamos utilizar numa dll. Então vamos lá começar:
Deve usar o Image Editor, criar uma nova Resource File
(.res), neste ficheiro vamos colocar os bitmaps e icons
(ambos funcionam da mesma forma) que queremos na
nossa aplicação, clique com a tecla direita do rato na
nova resource file e crie um novo bitmap, depois
desenhe ou cole do clipboard um bitmap, finalmente
guarde o ficheiro com o nome images.res. Depois disto
estar feito vá ao IDE do Delphi e no File menu clique
New… e escolha DLL depois cole o código abaixo, não
se esqueça de adicionar uma unit vazia ao projecto.
Guarde o projecta da dll no mesmo directório do ficheiro
image.res, finalmente faça o build da dll (não se
esqueça, que não se pode correr (executar) uma dll!)
Código da Dll:
library ImageRes; {nome da dll}
uses DummyUnit; {DummyUnit é uma unit
vazia, que é necessária}
{$R images.res} {nome da resource file,
que deve estar no mesmo caminho da dll}
begin
end.
Código da DummyUnit:
unit DummyUnit;
interface
implementation
end.
Usar os bitmaps que estão na dll:
Estão aqui alguns exemplos como extrair os bitmaps da
dll:
procedure
TForm1.SpeedButton1Click(Sender:TObject);
var
MyHandle :THandle;
Bmp : TBitmap;
begin
MyHandle := LoadLibrary(‘ImageRes.DLL’);
{nome da dll construida acima}
Bmp := TBitmap.Create;
Bmp.Handle := LoadBitmap(MyHandle,
‘BITMAP1’); {Bitmap1 é o nome do bitmap
criado no ficheiro image.res}
SpeedButton1.Glyph.Handle :=
LoadBitmap(MyHandle,‘BITMAP1’); {Carrega o
Bitmap1 para o glyph do SpeedButton1}
Canvas.Draw(0,0,Bmp); {Desenha o bitmap no
canvas da form}
Image1.picture.bitmap:=Bmp; {Carrega o
bitmap para o componente Timage}
Bmp.Free;
end;
311 - Teclas mágicas para
trabalhar mais rápido
Esta dica não tem código, são apenas alguns shortcuts
do teclado que permitem aumentar o rendimento do seu
trabalho no IDE do Delphi.
type
TForm1 = class(TForm)
Button1: TButton;
DBGrid1: TDBGrid;
Table1: TTable;
DataSource1: TDataSource;
procedure DBGrid1DrawColumnCell(Sender:
TObject; const Rect: TRect; DataCol:
Integer; Column: TColumn; State:
TGridDrawState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure
TForm1.DBGrid1DrawColumnCell(Sender:
TObject; const Rect: TRect; DataCol:
Integer; Column: TColumn; State:
TGridDrawState);
begin
If odd(Table1.RecNo) then
begin
DBGrid1.Canvas.Font.Color:= clWhite;
DBGrid1.Canvas.Brush.Color:= clGreen;
end
else
begin
DBGrid1.Canvas.Font.Color:= clBlack;
DBGrid1.Canvas.Brush.Color:= clWhite;
end;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.To
p,Column.Field.AsString);
end;
314 - Enviar relatório do
Quickreport para TXT
Uses QRExport
{ Exemplo 2 }
QuickRep1.ExportToFilter(TQRHTMLDocumentFi
lter.Create(‘C:\REPORT.htm’));
QuickRep1.ExportFilter.Free;
end;
Parâmetros:
HELP_CONTENTS - chama o arquivo de Help como se tivesse
dado um duplo-clique no arquivo .hlp
HELP_FINDER - Chama o help a partir do menu Conteúdo.
HELP_QUIT - Desativa o Help.
procedure
TForm1.ComboBox1DrawItem(Control:
TWinControl; Index: Integer; Rect: TRect;
State: TOWnerDrawState);
var
Bitmap: TBitmap;
Offset: Integer;
begin
with (Control as TComboBox).Canvas do
begin
FillRect(Rect); Bitmap:=
TBitmap(ComboBox1.Items.Objects[index]);
BrushCopy(Bounds(Rect.Left + 2, Rect.Top +
2, Bitmap.Width,
Bitmap.Height), Bitmap, Bounds(0, 0,
Bitmap.Width, Bitmap.Height), clRed);
Offset: Bitmap.width + 8;
TextOut(Rect.Left + Offset, Rect.Top,
ComboBox1.Items[index]);
end;
end;
procedure
TForm1.ComboBox1MeasureItem(Control:
TWinControl; Index: Integer; var Height:
Integer);
begin
Height:=20;
end;
327 - Colocando uma barra de
progresso para o batchmove
1 - No form, coloque um componente TDataSource.
2 - Na propriedade DataSet do TDataSource inserido,
coloque a tabela de origem, ou seja,
“DataSource1.DataSet:=BatchMove1.Source;”
3 - Utilize o evento OnChangeData do TDataSource p/
acompanhar o processo de cópia.
Lembre-se que antes disso você deverá utilizar a
propriedate RecordCount da tabela de origem para
saber o total de registros que serão copiados.
Lembre-se também que a cada registro lido, o evento
OnChangeData é chamado, portanto, é através desse
evento que você poderá acompanhar o
processo de cópia, e por exemplo, atualizar uma barra
de porcentagem.
328 - Colocar automaticamente a
senha em tabelas Paradox
Coloque o seguinte antes de abrir a tabela :
Table1.DBSession.AddPassword(‘senha_da_tab
ela’);
329 - Como evitar a mensagem de
erro Key Violation
Inclua a unit DBITYPES na clausula uses do seu form.
procedure TForm1.Table1PostError(DataSet:
TDataSet; E: EDatabaseError; var Action:
TDataAction);
begin
if EDBEngineError(E).Errors[0].ErrorCode =
9729 then
ShowMessage(‘Registro já existe!’);
Action:= daAbort;
end;
330 - Como Trocar o Cursor do
Mouse
Existem vários cursores no Delphi (crDefault é o cursor
padrão, crHourGlass é a ampulheta, crHandPoint é a
“mãozinha”, etc). Para alterá-lo, basta escolher um na
propriedade Cursor do componente em que você quer
mudar o cursor (troque no form para trocar o do form
inteiro). Mas, se você quiser colocar um cursor diferente,
siga os procedimentos abaixo:
Na seção interface da unit que contém o form, coloque
as seguintes linhas:
const
crSeuCursor = 1; // Tem que ser um valor
maior que 0 (zero)
No evento OnCreate do form, digite as seguintes linhas:
Screen.Cursors [crSeuCursor] :=
LoadCursorFromFile (‘Cursor.ani’);
// O cursor pode ser dos tipos comum
(*.cur) ou animado (*.ani)
// Lembre-se: o arquivo tem que estar na
mesma pasta do programa
// ou digite o nome do caminho dele.
Na hora de trocar de cursor, use o seguinte comando:
Objeto.Cursor := crSeuCursor;
onde Objeto é o nome do objeto que vai ter o cursor
alterado (o form, por exemplo).
331 - Configurando a Rede em
Win95/Win98 com Delphi
Vamos exemplificar com 3 máquinas, 1 servidor
chamado SERV e 2 máquinas clientes.Claro que isto
pode ser incrementado de acordo com suas
necessidades:
No servidor: diretório real D:\SISTEMA\DADOS
compartilhe o subdiretório D:\SISTEMA\DADOS como
um recurso chamado Servidor_Hno
Inclua no AUTOEXEC.BAT : Subst H:
D:\SISTEMA\DADOS
Nas máquinas clientes: mapear drive de rede H: como
\SERV1\Servidor_HNo no fim deste processo voce terá
o drive H: como sendo o seu Drive de rede para o
Sistema, este drive estará presente em todas as
máquinas e pode ser utilizado como seu NET DIR.
No BDE Configuration: NET DIR: H: (Para o driver
Paradox)
Em seu Alias: Path: H:\DADOS\
Em System: Local Share: True
Depois disto você configura o BDE de forma igual em
todas as máquinas da rede.
332 - Configurando RedeNovell
NetWare com Delphi
Configurar uma rede Novell para trabalhar com Delphi é
muito facíl, mais facíl que uma rede ponto a ponto como
Windows 95.
Primeiro precisamos de um diretório onde será criado o
NET FILE do Paradox, normalmente um diretório
partindo da raiz do servidor será o suficiente, vamos
usar o drive padrão da Novell para exemplificar o caso:
F: <— drive da rede
F:\NETDIR <— o diretório do NET FILE
Para o diretório onde serão armazenados os arquivos do
seus sistema não é necessário nenhum cuidado
especial, podemos assumir alguma configuração como a
que segue:
F:\SISTEMA\DADOS <— diretório de dados
Para quem trabalha todos os dias com uma rede Novell,
existe uma armadilha que pode causar umas noites mal
dormidas:
Uma das coisas que muitos tentam para economizar um
pouco do HD local, é colocar o executável na rede, sem
grandes problemas, desde que você tenha um cuidado
básico.
Sempre que você executa um programa que trata com
base Paradox, o PRIVATE DIR fica sendo o diretório
onde este executavél se encontra, no caso de você
colocar este executável em um diretório da rede para
ser acessado por muitos, como fica este diretório P
Para resolver este problema voce deve
“programaticamente” alterar oPrivate Dir para um
diretório local, para isso você tem de adicionar as
seguintes linhas de código ao iniciar a sua aplicação:
Session.PrivateDir := ‘C:\WINDOWS\TEMP’;
Para ter acesso a Session você tem de incluir a unit DB
na clausula Uses do seu projeto.
Este cuidado pode prevenir várias travadas sem razão
aparente em redes Novell.
333 - Convertendo nomes longos
para nomes curtos
Para converter um nome longo de arquivo para um
nome curto (e vice-versa), use as seguintes funções (a
primeira retorna um nome curto e a segunda um nome
longo):
function GetShortFileName (const Arquivo :
String) : String;
var
aTmp : array [0..255] of char;
begin
if GetShortPathName (PChar (Arquivo),
aTmp, sizeof (aTmp) - 1) = 0 then
Result := Arquivo
else
Result := StrPas (aTmp);
end;
procedure
TForm1.btnApagaFieldClick(Sender:
TObject);
var TC: TComponent;
begin
TC :=
FindComponent(‘qryClientecli_Nome’);
if not (TC = nil) then
begin
qryCliente.Close;
TC.Free;
qryCliente.Open;
end;
end;
336 - Alterando parcialmente o
conteúdo da prop.SQL de uma
Query
Vamos supor que você tenha uma instrução SQL em
uma Query como a seguinte:
SELECT IDCliente, cli_Nome, cli_DataNasc,
cli_Sexo
FROM Cliente
WHERE ( IDCliente < 1000 )
AND ( cli_Sexo = ‘M’ ) (*)
ORDER BY cli_Nome
Para alterar somente a quarta(*) linha do SQL você
pode fazer assim:
with qryCliente do
begin
if Active then Close;
SQL[3] := ‘AND ( cli_UF = ‘ES’) OR (
cli_UF = ‘RJ’ )’; // ou SQL[3] := ‘ ‘;
Open;
end;
337 - Como fazer uma unit como
biblioteca
COMO FAZER DCU PARA SERVIR COMO
BIBLIOTECA DE FUNCOES E COMO FAZER PARA
QUE OUTRO PROGRAMA ENXERGUE-AS.
PRIMEIRO:
PARA FAZER UMA UNIT DE FUNCOES, VOCÊ TEM
QUE COMPILA-LA PARA GERAR A EXTENSÃO DCU.
PARA FAZER COM QUE ELA VIRE UMA BIBLIOTECA
DE FUNÇÕES ELA TEM QUE TER A EXTENSÃO DCU.
SEGUNDO:
VOCÊ NÃO VAI CONSEGUIR COMPILAR UMA UNIT
SE ELA ESTIVER SOZINHA, ISTO PORQUE O DELPHI
SÓ COMPILA PROJETOS E COMO UNIT NÃO É
PROJETO A OPÇÃO DE COMPILAÇÃO NÃO ESTARÁ
DISPONÍVEL. PORTANTO, ABRA UM PROJETO
QUALQUER, OU MESMO CRIE UM ALEATORIO E
ABRA UMA NOVA UNIT, É NESTA UNIT E NÃO A DO
PROJETO QUE VOCÊ CRIARÁ TODAS AS SUAS
FUNÇÕES. DEPOIS DISTO ENTÃO VOCÊ
ABANDONA O FORM E SÓ VAI USAR A UNIT.
TERCEIRO:
QUANDO VOCÊ ABRIR A UNIT, ESTA VIRÁ SOMENTE
COM O NOME, INTERFACE, IMPLEMENTATION E
END..
EXEMPLO:
Unit unit1;
Interface
Implementation
End.
QUARTO:
PARA VOCÊ CRIAR UMA FUNÇÃO O
PROCEDIMENTO É IGUAL Á UNIT COMUM, MAS
PARA QUE ELA SEJA ENXERGADA POR OUTROS
PROGRAMAS PRECISA SER DECLARADA ABAIXO
DA INTERFACE E ABAIXO DE POSSIVEIS USES
NECESSÁRIOS AS SUAS FUNÇÕES.
EXEMPLO DE UMA UNIT DE FUNÇÕES:
unit ufuncoes; //NOME DA UNIT
interface
function data(vdata:string):boolean; //
DECLARAÇÃO DAS FUNÇÕES OU PROCEDURES
procedure cor(grade:tdbgrid;color:tcolor);
// PARA PODEREM SER ENXERGADAS POR OUTRAS
UNITS.
// COLOQUE OS MESMOS CABEÇALHOS DA SUA
FUNÇÀO
function data(vdata:string):boolean;
begin
try
StrToDate(vdata);
data:=true;
except
MessageDlg(‘Data Inválida !!’ ,
mtInformation, [mbOk], 0);
data:=false;
end;
end;
procedure cor(grade:tdbgrid;color:tcolor);
// muda a cor para preto para todas as
colunas de qualquer dbgrid
var
i:integer;
numcampos:integer;
begin
numcampos:=grade.FieldCount;
{subtraio -1 aqui embaixo porque as
colunas começam de zero}
for I := 0 to numcampos-1 do // COLOCA AS
23 COLUNAS COM COR PRETA
grade.columns[i].font.color:=color;
end;
end.
QUINTO:
PARA QUALQUER UNIT ENXERGAR ESTAS DUAS
FUNÇÕES ACIMA, É NECESSÁRIO QUE VOCÊ
COLOQUE ESTA UNIT NO DIRETORIO DO SEU
PROGRAMA QUE VAI UTILIZÁ-LA E DEPOIS É SÓ
COLOCÁ-LA NA USES DA UNIT QUE FARÁ O USO
DAS MESMAS. APÓS ISTO É SÓ CHAMAR AS
FUNÇÕES QUE NELA CONSTEM QUE
FUNCIONARÃO PERFEITAMENTE, INCLUSIVE
PODEM SER DEBUGADAS, O DEBUG ENTRARÁ NA
UNIT DAS FUNÇÕES SE VOCÊ FOR TECLANDO F7.
338 - Como imprimir com codigo
fonte
unit animais; {exemplo de impressao com
codigo fonte do arquivo exemplo de delphi
chamado animais. mostra como aumentar a
fonte, mudar a fonte, mudar a grossura da
linha, imprimir uma reta, imprimir
caracteres e dados}
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
DBCtrls, ExtCtrls, Grids, DBGrids, Db,
DBTables, ExtDlgs, StdCtrls,printers,
ComCtrls, Buttons, Outline, DirOutln;
type
TForm1 = class(TForm)
dtanimais: TTable;
dsanimais: TDataSource;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
DBImage1: TDBImage;
Imprime: TBitBtn;
dtanimaisNAME: TStringField;
dtanimaisSIZE: TSmallintField;
dtanimaisWEIGHT: TSmallintField;
dtanimaisAREA: TStringField;
dtanimaisBMP: TBlobField;
procedure ImprimeClick(Sender: TObject);
procedure FormKeyPress(Sender: TObject;
var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
pag:integer;
linha:integer;
implementation
{$R *.DFM}
procedure TForm1.FormKeyPress(Sender:
TObject; var Key: Char);
begin
if (Key=VK_ESCAPE) and (Printer.Printing)
then
begin
Printer.Abort;
MessageDlg(‘Impressão abortada’,
mtInformation, [mbOK],0);
end;
end;
procedure cabrelat;
begin
inc(pag,1); // INCREMENTA NA VARIAVEL PAG
+1
printer.canvas.pen.width:=9; {expessura do
traco}
INC(LINHA,80); // INCREMENTA NA VARIAVEL
LINHA +80
printer.canvas.textout(3700,LINHA,‘PAG:
‘+INTTOSTR(PAG));
INC(LINHA,80);
printer.canvas.moveto(4000,LINHA); {moveto
e lineto funcionam como coluna inicial e
final}
printer.canvas.lineto(5,LINHA); {traco da
coluna 5 ate a 4000 em pixels, varia de
impressora p/impressora}
INC(LINHA,5);
printer.canvas.font.size:=14; {tamanho da
fonte}
printer.canvas.textout(3,LINHA,NOME); {O
PRINTER.CANVAS.TEXTOUT, imprime dados ou
caracteres}
printer.canvas.textout(1400,
linha,TAMANHO);
printer.canvas.textout(2300, linha,PESO);
printer.canvas.textout(3100, linha,AREA);
INC(LINHA,120);
printer.canvas.moveto(4000,LINHA);
printer.canvas.lineto(5,LINHA);
INC(LINHA,10);
printer.canvas.font.size:=12;
end;
procedure rodape;
begin
INC(LINHA,80);
printer.canvas.font.style:=[fsitalic];
{tipos de fonte: fsBold, fsItalic,
fsUnderline, fsStrikeOut);}
printer.canvas.textout(4000,LINHA,‘CONTINU
A’);
INC(LINHA,80); {font.color := clred;}
printer.canvas.pen.width:=9; {espessura da
linha}
printer.canvas.moveto(4000,linha);
printer.canvas.lineto(5,linha);
printer.canvas.font.style:=[]; {estilo da
linha}
printer.newpage;
linha:=30;
end;
procedure TForm1.ImprimeClick(Sender:
TObject);
VAR
nnumero: integer;
begin
{dtanimais.setkey;}
cancela.visible:=true;
{torna visivel o botao de cancelar no
form}
form1.refresh;
{faz o form mostrar o botao cancela, sem o
refresh nao adianta colocar o botao de
cancela visivel}
nnumero:=0;
pag:=0;
linha:=30;
printer.begindoc; {inicializa a
impressora}
CABRELAT;
dtanimais.first;
while not (dtanimais.eof) do
begin
printer.canvas.textout(3,
linha,dtanimaisname.text);// IMPRIME OS
CAMPOS DO ARQUIVO
printer.canvas.textout(1800,
linha,dtanimaissize.text); {campo size}
printer.canvas.textout(2500,
linha,dtanimaisweight.text);{campo weight}
printer.canvas.textout(3100,
linha,dtanimaisarea.text); {campo area}
inc(linha,120); { o inc() incrementa
pixels e aqui esta incrementando 120}{
entre um registro e outro}
dtanimais.next; {pula registro}
application.processmessages; {Sem isso nao
adianta clicar no botao cancela}
if not printer.printing then {caso tenha
abortado a impressao num click}
{o printer ja nao estara imprimindo, entao
entrara aqui}
exit;
inc(nnumero,1);
if linha>=3400 then
BEGIN
RODAPE;
CABRELAT;
END;
if dtanimais.eof then
begin
printer.canvas.pen.width:=9;
INC(LINHA,80);
printer.canvas.moveto(4000,LINHA);
printer.canvas.lineto(5,LINHA);
INC(LINHA,60);
printer.canvas.font.name:=‘arial’;
printer.canvas.font.size:=10;
printer.canvas.textout(5,linha,‘TOTAL DE
ANIMAIS:’);
printer.canvas.textout(1000,linha,INTTOSTR
(NNUMERO));
INC(LINHA,100);
printer.canvas.moveto(4000,LINHA);
printer.canvas.lineto(5,LINHA);
printer.canvas.font.size:=14;
printer.enddoc;
end;
end;
if printer.printing then
printer.enddoc;
dtanimais.first; {retorno ao inicio da
tabela}
end;
end.
339 - Dicas de DbGrid
TROCAR O NOME NO TITULO DE
CADA CAMPO
1 Clique duas vezes sobre o dbgrid, isto fará aparecer
uma janela, nesta janela clique com o botão direito do
mouse e selecione add fields., todos os campos
aparecerão.
2 Para mudar o nome do titulo de cada campo,
selecione o campo desejado e no object inspector vá na
propriedade title, clique no sinal de mais que se
encontra no lado esquerdo da propriedade, nas opções
que aparecerem mude a propriedade caption, o que
você escrever aqui, ficará no titulo.
COLOCAR O DBGRID EM ORDEM
DO TITULO CLICADO
1 No evento ontitleclick, criar uma variavel chamada
campo, campo então receberá a coluna clicada, para
depois a query fazer o order by pelo campo escolhido.
procedure
Tconscli.gradeprocessosTitleClick(Column:
TColumn);
var
campo:string;
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
qrCLIENTES.sql.clear; // LIMPA A QUERY
qrCLIENTES.sql.add(‘select * from div1
order by ‘+campo); // ESCREVE O SELECT COM
O ORDER BY
if not QRCLIENTES.Prepared then
QRCLIENTES.Prepare;
QRCLIENTES.Open; // ABRE A QUERY COM A
ORDEM ESCOLHIDA.
End;
column.Font.color:=clblue; // COLOCAR A
COLUNA NA COR DESEJADA
BUSCA RECURSIVA NO DBGRID
1 Colocar o dbgrid em modo de leitura.
2 Criar uma variavel publica chamada letras no inicio do
form;
3 Clicar no evento onkeypress do dbgrid e fazer isto
abaixo:
letras:=letras+uppercase(key); // acumula
as letras digitadas
QRclientes.LOCATE(CAMPO,LETRAS,
[loPartialKey]); // Efetua a procura
4 Para zerar a variavel letras, basta escolher um evento
de click ou de tecla pressionada e inserir:
letras:=;
Minha dica fica para o evento onkeydown com isto:
IF (KEY=38) or (key=40) then // avalio se
é seta para cima ou para baixo;
letras:=”;
end;
e no evento oncelclick colocar isto:
letras:=;
Desta forma quando clicar na célula ou teclar seta para
cima ou para baixo a variavel letras zerará.
TROCAR O TAB PELO ENTER NO
DBGRID
begin
case key of
13 : Key := 9;
end;
end;
340 - Para colocar um back ground
nos forms
Coloque um TImage no seu formulário, escolha uma
Picture e deixe a propriedade Visible = False.
Depois, no evento OnPaint do Form, use o seguinte
código:
for i:= 0 to Round(Width/Image1.Width) do
for j := 0 to Round(Height/Image1.Height)
do
Canvas.Draw(i*Image1.Width,j*Image1.Height
,Image1.Picture.Graphic);
Caso utilize um BitMap, pode substituir o
Image1.Picture.graphic por Image1.BitMap.
341 - Como indexar um vetor
Veja o exemplo:
for x := 1 to 10 do
for y := 1 to 10 do
if array[x] < array[y] then begin
varaux := array[y];
array[y] := array[x];
array[x] := varaux;
end;
Consiste no seguinte para cada item do vetor vc verifica
todos os outros, se for menor faz a troca.
Simples não?
A fução aSort do clipper encapsula este processo pra
vc.
342 - Como formatar data para
exibição por extenso
O Delphi permite formatar datas para apresentação por
extenso de forma bastante simples. Vejamos os
seguintes exemplos:
Para formatar a data 18/03/1999, podemos utilizar:
No create do form colocar
Shortdateformat:=
interface
uses
DBGrids, DB, DBTables, Grids, WinTypes,
Classes, Graphics;
type
TDBPicGrid = class (TDBGrid)
protected
procedure DrawDataCell(const Rect: TRect;
Field: TField; State:
TGridDrawState); override;
public
constructor Create (AOwner : TComponent);
override;
published
property DefaultDrawing default False;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents (‘Custom’,
[TDBPicGrid]);
end;
end.
345 - Como acessar pelo Delphi,
tabelas no Acess
Primeiro crie um alias apontando para o diretorio onde
está o arquivo mdb do access, este apontamento deve
ser testado clicando no botão connectt. Se funcionar,
pode fechar salvando o novo alias. Caso contrário
verifique se o diretório está correto e se o arquivo mdb
existe neste diretório.
Bem, após isso, vá no delphi, abra um projeto novo,
coloque um componente tdatabase, uma query, um
datasource e um dbgrid. Após isso clique duas vezes no
componente tdatabase, após clicar, aparecerá um
formulário, informe o nome que deseja dar ao database
em name, em alias name, clique na seta e escolha o
alias criado anteriormente, depois clique em defaults, se
quiser uma senha para acesso ao banco, procure a
palavra PASSWORD dentro da janela que foi
preenchida com comandos quando você clicou em
defaults, e digite a senha desejada, se não quiser senha
deixe em branco. Após fazer isto, clique em OK. Bem,
agora vá em propriedades do tdatabase e clique em
conectt, ele vai pedir um usuário e uma senha, se não
colocou password, basta clicar em ok que ele se
conectará e caso tenha uma password digite-a. Uma vez
conectado, vá na query, na propriedade strings, coloque
a instrução SELECT acessando a tabela que está dentro
do arquivo MDB. Veja bem, não é para colocar o arquivo
mdb mas sim uma ou mais das tabelas que estão dentro
do MDB. Depois disso na propriedade database,
escolha o nome que deu ao seu database, se você fez
tudo correto, o nome dele tem que estar na lista. Bom,
agora active a query. Após isso vá no datasource e
conecte-o á query, e depois vá no dbgrid e sete o
datasource para o datasource criado. Se fez tudo
correto e se a tabela tiver dados, você os verá no dbgrid.
346 - Extarir palavra que está sob
o cursor
function RECharIndexByPos(RichEdit:
TRichEdit; X, Y: Integer): Integer;
{ retorna a posição absoluta do caracter
para um conjunto de coordenadas do cursor}
var
P: TPoint;
begin
P := Point(X, Y);
Result := SendMessage(RichEdit.Handle,
EM_CHARFROMPOS, 0, longint(@P));
end;
function REExtractWordFromPos(RichEdit:
TRichEdit; X, Y: Integer): string;
{ X, Y - coordenadas num controle rich
edit }
{retorna a palavra sob a posição corrente
do cursor}
var
BegPos, EndPos: Integer;
begin
BegPos := RECharIndexByPos(RichEdit, X,
Y);
if (BegPos < 0) or
(SendMessage(RichEdit.Handle,EM_FINDWORDBR
EAK,WB_CLASSIFY,BegPos) and
(WBF_BREAKLINE or WBF_ISWHITE) <> 0 ) then
begin
result:=”;
exit;
end;
if SendMessage(RichEdit.Handle,
EM_FINDWORDBREAK, WB_CLASSIFY, BegPos- 1)
and
(WBF_BREAKLINE or WBF_ISWHITE) = 0 then
BegPos := SendMessage(RichEdit.Handle,
EM_FINDWORDBREAK,
WB_MOVEWORDLEFT, BegPos);
EndPos := SendMessage(RichEdit.Handle,
EM_FINDWORDBREAK,
WB_MOVEWORDRIGHT, BegPos);
Result :=
TrimRight(REGetTextRange(RichEdit, BegPos,
EndPos - BegPos));
end;
347 - Como extrair o primeiro nome
de uma pessoa
Para pegar o primeiro nome de uma pessoa, crie a
seguinte função:
function PrimeiroNome (Nome : String) :
String;
var
PNome : String;
begin
PNome := ”;
if pos (‘ ‘, Nome) <> 0 then
PNome := copy (Nome, 1, pos (‘ ‘, Nome) -
1);
Result := PNome;
end;
348 - Criar atalho no desktop
Coloque essas units na seção implementation :
uses ShlObj, ActiveX,ComObj, Registry;
Por último, crie uma procedure que faça o trabalho:
procedure CreateShortcut (FileName,
Parameters, InitialDir, ShortcutName,
ShortcutFolder : String);
var
MyObject : IUnknown;
MySLink : IShellLink;
MyPFile : IPersistFile;
Directory : String;
WFileName : WideString;
MyReg : TRegIniFile;
begin
MyObject :=
CreateComObject(CLSID_ShellLink);
MySLink := MyObject as IShellLink;
MyPFile := MyObject as IPersistFile;
with MySLink do
begin
SetArguments(Parameters);
SetPath(PChar(FileName));
SetWorkingDirectory(PChar(InitialDir));
end;
MyReg :=
TRegIniFile.Create(‘Software\MicroSoft\Win
dows\CurrentVersion\Explorer’);
Directory := MyReg.ReadString (‘Shell
Folders’,‘Desktop’,”);
WFileName := Directory + ‘' + ShortcutName
+ ‘.lnk’;
MyPFile.Save (PWChar (WFileName), False);
MyReg.Free;
end;
349 - Imprimir com precisão
milimétrica
O objeto Canvas que está na classe Printer é uma
ferramenta que ajuda muito a imprimir qualquer tipo de
dados, sejam eles texto ou gráficos. O problema é que a
largura e a altura são determinadas em pixels, e esses
valores variam de acordo com a resolução da
impressora. Para converter de milímetros para pixels,
use as funções abaixo, sendo que MMtoPixelX é para a
resolução horizontal e MMtoPixelY é para a resolução
vertical (porque na impressora é possível uma resolução
como 1440x720 dpi - 1440 dpi para a horizontal e 720
dpi para a vertical, por exemplo):
function MMtoPixelX (MM : Integer) :
Longint;
var
mmPointX : Real;
PageSize, OffSetUL : TPoint;
begin
mmPointX := Printer.PageWidth /
GetDeviceCaps(Printer.Handle,HORZSIZE);
Escape
(Printer.Handle,GETPRINTINGOFFSET,0,nil,@O
ffSetUL);
Escape
(Printer.Handle,GETPHYSPAGESIZE,0,nil,@Pag
eSize);
if MM > 0 then
Result := round ((MM * mmPointX) -
OffSetUL.X)
else
Result := round (MM * mmPointX);
end;
procedure TForm1.ParadoxPack(Table :
TTable);
var
TBDesc : CRTblDesc;
hDb: hDbiDb;
TablePath: array[0..dbiMaxPathLen] of
char;
begin
Table.Open;
FillChar(TBDesc,Sizeof(TBDesc),0);
with TBDesc do
begin
StrPCopy(szTblName,Table.TableName);
StrPCopy(szTblType,szParadox);
bPack := True;
end;
hDb := nil;
Check(DbiGetDirectory(Table.DBHandle,
True, TablePath));
Table.Close;
Check(DbiOpenDatabase(nil, ‘STANDARD’,
dbiReadWrite, dbiOpenExcl,nil,0, nil,
nil, hDb));
Check(DbiSetDirectory(hDb, TablePath));
Check(DBIDoRestructure(hDb,1,@TBDesc,nil,n
il,nil,False));
Table.Open;
end;
Exemplo de Uso:ParadoxPack(Table1);
387 - Fazendo uma impressão
direta
procedure Say(Nlin,Ncol: Integer;Var
LinhaAtual: Integer; Var Arquivo:
Text;Texto: Variant);
{Função para impressão de linhas em um
relatório}
var
X: Integer;
begin
Write(Arquivo,#13);
If Nlin<>LinhaAtual then
begin
for X :=LinhaAtual to (Nlin-1) do
begin
WriteLn(Arquivo,”);
LinhaAtual:=LinhaAtual+1;
end;
end;
If Ncol>0 then
begin
For X:=0 to Ncol do
begin
Write(Arquivo,’ ‘);
end;
end;
If LinhaAtual >=63 then { 63 É O NÚMERO DA
ÚLTIMA LINHA ANTES DO RODAPÉ}
begin
For X:=63 to 67 do { 67 É A QUANTIDADE DE
LINHAS POR PÁGINA }
begin
Writeln(Arquivo,”);
LinhaAtual:=1;
end;
end;
Write(Arquivo,Texto);
end;
procedure TForm1.Button1Click(Sender:
TObject);
var
ArqPrn: TextFile;
LinhaAtual: Integer;
begin
LinhaAtual:=0;
AssignFile(ArqPrn,‘LPT1’);
ReWrite(ArqPrn);
Say(00,00,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(01,01,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(02,00,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(03,03,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(04,00,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(05,03,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(06,00,LinhaAtual,ArqPrn,‘Wincomp
Informática Ltda’);
Say(07,04,LinhaAtual,ArqPrn,123456789);
Say(08,00,LinhaAtual,ArqPrn,123456789);
Say(09,00,LinhaAtual,ArqPrn,123456789);
CloseFile(ArqPrn);
end;
388 - Fazendo uma janela filha de
outra sem usar MDI
procedure TForm1.CreateParams(var Params:
TCreateParams);
begin
inherited CreateParams(Params); { call the
inherited first }
with Params do
begin
Style := Style or WS_CHILD; { add a style
flag }
WndParent := Application.MainForm.Handle;
end;
end;
389 - Finalizando todas as tarefas
procedure
TForm1.ButtonKillAllClick(Sender:
TObject);
var
pTask : PTaskEntry;
Task : Bool;
ThisTask: THANDLE;
begin
GetMem (pTask, SizeOf (TTaskEntry));
pTask^.dwSize := SizeOf (TTaskEntry);
Task := TaskFirst (pTask);
while Task do
begin
if pTask^.hInst = hInstance then
ThisTask := pTask^.hTask
else
TerminateApp (pTask^.hTask, NO_UAE_BOX);
Task := TaskNext (pTask);
end;
TerminateApp (ThisTask, NO_UAE_BOX);
end;
390 - Como incrementar 1 mês
numa data
IncMonth(Data, 1);
No exemplo, a variável Data é do tipo TDateTime.
{$R *.DFM}
// VERIFICA E APRESENTA AS INFORMAÇÕES do
SISTEMA OPERACIONAL
procedure
TfrmSobreManager.FormCreate(Sender:
TObject);
var
verInfo : TOsVersionInfo;
str : String;
I : Word;
begin
verInfo.dwOSVersionInfoSize :=
SizeOf(TOSVersionInfo);
if GetVersionEx(verInfo) then begin
stOSVersao.Caption := ‘Versão : ‘+
IntToStr(verInfo.dwMajorVersion) +
IntToStr(verInfo.dwMinorVersion);
OSBuilder.Caption := ‘Compilação :
‘+IntToStr(verInfo.dwBuildNumber);
str := ‘Sistema Operacional : ‘;
case verInfo.dwPlatformId of
VER_PLATFORM_WIN32s : stOS.Caption := str
+‘Windows 95’;
VER_PLATFORM_WIN32_WINDOWS : stOS.Caption
:= str +‘Windows 95 Osr2 / 98’;
VER_PLATFORM_WIN32_NT : stOS.Caption :=
str +‘Windows NT’;
end;
str := ”;
for I := 0 to 127 do
str := str + verInfo.szCSDVersion[I];
stOSService.Caption := ‘Informações
Adicionais : ‘+ str;
end
end;
end.
392 - Unit com varias funções de
datas
unit FaCDate;
{** Criada em 24/07/1999 - Baseada em
necessidades genericas de tratamento de
datas ** Autor : Fabio Camara}
interface
uses
Forms, Dialogs, Messages, WinProcs,
SysUtils, Classes,
Graphics, ExtCtrls, Controls;
function
ReturnSixMonth(Actual:TDateTime):Semestre;
function
NameMonth(Mes:Word;Abrev:Boolean):string;
function DataExtenso(Data:TDateTime):
string;
function DataValida(StrD: string):
boolean;
function
PrimeiroDiaUtil(Data:TDateTime):TDateTime;
function IsWeekEnd(dData : TDateTime) :
boolean;
implementation
function
ReturnSixMonth(Actual:TDateTime):Semestre;
{Retorna 6 meses atrás da data enviada, de
mes em mes}
var
d,m,y : word;
i : byte;
Data : TDateTime;
begin
for i := 6 downto 1 do begin
Data := Actual - (30 * i);
DecodeDate(Data,y,m,d);
Result[i].Mes := m;
Result[i].Ano := y;
end;
end;
function
NameMonth(Mes:Word;Abrev:Boolean):String;
{Retorna o nome de um mês abreviado ou
não}
const
NameL : array [1..12] of String[9] =
(‘JANEIRO’,‘FEVEREIRO’,‘MARÇO’,‘ABRIL’,
‘MAIO’,‘JUNHO’,‘JULHO’,‘AGOSTO’,
‘SETEMBRO’,‘OUTUBRO’,‘NOVEMBRO’,
‘DEZEMBRO’);
begin
if (Mes in [1..12]) then
if Abrev then
Result := Copy(NameL[Mes],1,3)
else
Result := NameL[Mes];
end;
function DataExtenso(Data:TDateTime):
String;
{Retorna uma data por extenso}
var
NoDia : Integer;
DiaDaSemana : array [1..7] of String;
Meses : array [1..12] of String;
Dia, Mes, Ano : Word;
begin
{ Dias da Semana }
DiaDasemana [1]:= ‘Domingo’;
DiaDasemana [2]:= ‘Segunda-feira’;
DiaDasemana [3]:= ‘Terçafeira’;
DiaDasemana [4]:= ‘Quarta-feira’;
DiaDasemana [5]:= ‘Quinta-feira’;
DiaDasemana [6]:= ‘Sexta-feira’;
DiaDasemana [7]:= ‘Sábado’;
{ Meses do ano }
Meses [1] := ‘Janeiro’;
Meses [2] := ‘Fevereiro’;
Meses [3] := ‘Março’;
Meses [4] := ‘Abril’;
Meses [5] := ‘Maio’;
Meses [6] := ‘Junho’;
Meses [7] := ‘Julho’;
Meses [8] := ‘Agosto’;
Meses [9] := ‘Setembro’;
Meses [10]:= ‘Outubro’;
Meses [11]:= ‘Novembro’;
Meses [12]:= ‘Dezembro’;
DecodeDate (Data, Ano, Mes, Dia);
NoDia := DayOfWeek (Data);
Result := DiaDaSemana[NoDia] + ‘, ‘ +
IntToStr(Dia) + ‘ de ‘ + Meses[Mes]+ ‘
de ‘ + IntToStr(Ano);
end;
function
PrimeiroDiaUtil(Data:TDateTime):TDateTime;
{Retorna data do primeiro dia Util do mes,
de uma data informada}
var Ano, Mes, Dia : word;
DiaDaSemana : Integer;
begin
DecodeDate (Data, Ano, Mes, Dia);
Dia := 1;
DiaDaSemana := DayOfWeek(Data);
if DiaDaSemana in [1,7] then
Dia := 2;
Result := EncodeDate(Ano, Mes, Dia);
end;
Reg.OpenKey(‘ArquivoDaniel\shell\open\comm
and’, true);
Reg.WriteString(”, ParamStr(0) + ‘ %1’);
{ NomeDoExe %1 }
Reg.CloseKey;
{ Define o ícone a ser usado no Windows
Explorer:
0 - primeiro ícone do EXE
1 - segundo ícone do EXE, etc }
Reg.OpenKey(‘ArquivoDaniel\DefaultIcon’,
true);
Reg.WriteString(”, ParamStr(0) + ‘,0’);
{ 0 = primeiro ícone }
Reg.CloseKey;
{ Define as extensões de arquivos que
serão abertos pelo meu aplicativo }
{ *.dpg }
Reg.OpenKey(‘.dpg’, true);
Reg.WriteString(”, ‘ArquivoDaniel’);
Reg.CloseKey;
{ *.dan }
Reg.OpenKey(‘.dan’, true);
Reg.WriteString(”, ‘ArquivoDaniel’);
Reg.CloseKey;
finally
Reg.Free;
end;
end;
- Coloque um TMemo;
- No evento OnShow do Form coloque o código abaixo:
procedure TForm1.FormShow(Sender:
TObject);
begin
{ Se o primeiro parâmetro for um nome de
arquivo existente… }
if FileExists(ParamStr(1)) then
{ Carrega o conteúdo do arquivo no memo
}
Memo1.Lines.LoadFromFile(ParamStr(1));
end;
*** Para testar ***
- Execute este programa;
- Clique no botão para criar as chaves no Registro do
Windows;
- Feche o programa;
- Crie alguns arquivos com as extensões .dpg e .dan;
- Vá ao Windows Explorer e procure pelos arquivos
criados;
- Experimente dar um duplo-clique sobre qualquer dos
arquivos com uma das extensões acima.
Observações
Existem outros recursos que poderão ser configurados.
Porém, para começar, este já é um bom exemplo.
400 - Consultar por mês de um
campo data
Problema:
Tenho um cadastro de clientes com Codigo, Nome,
DataNasc, etc.
Preciso fazer uma consulta onde apareceão apenas os
clientes que fazem aniversário em determinado mês.
Como fazer?
Solução:
Use uma Query como abaixo:
- Coloque no form os seguintes componentes:
* TQuery
* TDataSource
* TDBGrid
* TEdit
* TButton
- Altere as propriedades dos componentes como abaixo:
* Query1.DatabaseName = (alias do BDE)
* DataSource1.DataSet = Query1
* DBGrid1.DataSource = DataSource1
- Coloque o código abaixo no evento OnClick de
Button1:
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(‘select * from dCli’);
Query1.SQL.Add(‘where extract(month from
DataNasc) = :Mes’);
Query1.ParamByName(‘Mes’).AsInteger :=
StrToInt(Edit1.Text);
Query1.Open;
- Execute. Digite um número de 1 a 12 no Edit e clique
no botão.
Observações
Os números de 1 a 12 representam, respectivamente,
os meses de Janeiro a Dezembro. Este exemplo foi
testado com Delphi4, BDE5 e tabela Paradox7.
401 - Criando tabelas via SQL
Inclua na seção uses: dbTables
- Coloque um TButton no form;
- Escreve no OnClick do Button como abaixo:
procedure TForm1.Button1Click(Sender:
TObject);
var
Q: TQuery;
begin
Q := TQuery.Create(Application);
try
Q.DatabaseName := ‘SF’;
with Q.SQL do begin
Add(‘Create Table Funcionarios’);
Add(‘( Codigo AutoInc,’);
Add(‘ Nome Char(30),’);
Add(‘ Salario Money,’);
Add(‘ Depto SmallInt,’);
Add(‘ Primary Key (Codigo) )’);
end;
Q.ExecSQL;
finally
Q.Free;
end;
end;
Observações
Este exemplo foi testado com banco de dados Paradox,
porém deverá funcionar em vários outros bancos de
dados com pouca ou nenhuma alteração.
402 - Obter nomes dos campos de
uma tabela
Inclua na seção uses: dbTables, Classes, Forms
A função abaixo obtém os nomes de todos os campos
de uma tabela do banco de dados.
procedure tbGetFieldNames(const DBName,
TblName: string;
List: TStringList);
var
I: integer;
begin
List.Clear;
with TTable.Create(Application) do
try
DatabaseName := DBName;
TableName := TblName;
with FieldDefs do begin
Update;
for I := 0 to Count -1 do
List.Add(Items[I].Name);
end;
finally
Free;
end;
end;
=== Exemplo de uso ===
- Coloque um TMemo e um TButton no Form;
- Coloque o código abaixo no evento OnClick do Button:
procedure TForm1.Button1Click(Sender:
TObject);
var
List: TStringList;
begin
List := TStringList.Create;
try
tbGetFieldNames(Edit1.Text, Edit2.Text,
List);
Memo1.Lines.Assign(List);
finally
List.Free;
end;
end;
403 - Nomeando um relatório no
spool de impressão do Windows
Inclua na seção uses: Printers
Problema:
Quando mandamos imprimir no Windows, normalmente
o nome do documento aparece na fila de impressão
(spool). Como fazer com que aplicativos feitos em
Delphi se comporte desta forma? Ou seja, como nomear
meus relatórios feitos em Delphi?
Solução:
Antes de enviar seu relatório, faça assim:
Printer.Title := ‘Nome do relatório’;
Observações
Esta solução aplica-se perfeitamente aos relatórios
feitos usando o objeto Printer. Nos casos de geradores
de relatórios, estes provavelmente possuem uma
propriedade equivalente.
404 - Impedir que o form seja
arrastado para fora das margens da
tela
- Na seção Private declare a procedure abaixo:
private
procedure WMMove(var Msg: TWMMove);
message WM_MOVE;
- Abaixo da palavra implementation escreva a procedure
abaixo:
procedure TForm1.WMMove(var Msg: TWMMove);
begin
if Left < 0 then
Left := 0;
if Top < 0 then
Top := 0;
if Screen.Width - (Left + Width) < 0
then
Left := Screen.Width - Width;
if Screen.Height - (Top + Height) < 0
then
Top := Screen.Height - Height;
end;
Para testar:
- Execute o programa e tente arrastar o form para fora
das margens da tela e veja o que acontece.
405 - Mostrar mensagem mesmo
que esteja no Prompt do DOS
Inclua na seção uses: Windows
Problema:
Fiz um programa que mostra mensagens de lembrete
quando é chegada determinada data/hora. Porém
quando o usuário vai para o Prompt do MS-DOS em
modo tela cheia, a mensagem não aparece. O que devo
fazer?
Solução:
Antes de mostrar a mensagem, coloque sua aplicação
na frente das demais.
SetForegroundWindow(Application.Handle);
ShowMessage(‘Teste’);
406 - Criar sub-diretório no
diretório do EXE
Inclua na seção uses: FileCtrl, SysUtils
Problema:
Gostaria de criar um sub-diretório dentro do diretório
onde se encontra o EXE de minha aplicação. Como
fazer?
Solução:
Primeiramente vamos conhecer algumas funções do
Delphi que precisaremos usá-las:
ParamStr(Indice) - Retorna valores passados na linha
de comando quando executamos o programa. Se o valor
de Indice for 0 (zero) será retornado o caminho+nome
do EXE.
ExtractFilePath(NomeArq) - Retorna o caminho (path)
do nome de arquivo informado.
Exemplo:
S := ‘C:\NomeDir\Programa.exe’;
ExtractFilePath(S); { retorna:
‘C:\NomeDir' }
DirectoryExists(CaminhoDir) - Retorna true se o
diretório informado existe. False em caso contrário.
CreateDir(CaminhoDir) - Tenta criar o diretório
informado.
Se conseguir, retorna true. Caso contrário retorna false.
Agora que sabemos como trabalham estas funções,
vamos escrever uma função que precisamos para criar
um sub-diretório conforme proposto.
function CriaSubDir(const NomeSubDir:
string): boolean;
var
Caminho: string;
begin
Caminho := ExtractFilePath(ParamStr(0))
+ NomeSubDir;
if DirectoryExists(Caminho) then
Result := true
else
Result := CreateDir(Caminho);
end;
Exemplo de uso:
- Chame a função no evento OnCreate do form:
procedure TForm1.FormCreate(Sender:
TObject);
begin
if not CriaSubDir(‘MeuSubDir’) then
ShowMessage(‘Não foi possível criar o
sub-diretório MeuSubDir.’);
end;
407 - Enviar comandos de rolagem
vertical para um TMemo
Inclua na seção uses: Windows
Problema:
Gostaria que o meu programa rolasse automaticamente
o conteúdo de um TMemo, simulando o deslizamento da
barra de rolagem vertical. Isto é possível no Delphi?
Solução:
Sim. Utilizando mensagens do Windows isto é fácil.
Vejamos algums exemplos:
SendMessage(Memo1.Handle, WM_VSCROLL,
SB_PAGEDOWN, 0);
Onde:
Memo1.Handle = manipulador da janela do Memo1.
WM_VSCROLL = Mensagem do Windows - rolagem
vertical.
SB_PAGEDOWN = Comanndo de rolagem - página para
baixo.
Outros exemplos:
{ Página para cima }
SendMessage(Memo1.Handle, WM_VSCROLL,
SB_PAGEUP, 0);
{ Linha para baixo }
SendMessage(Memo1.Handle, WM_VSCROLL,
SB_LINEDOWN, 0);
{ Linha para cima }
SendMessage(Memo1.Handle, WM_VSCROLL,
SB_LINEUP, 0);
Observações
Além desta técnica existem API’s do Windows que
fazem um trabalho equivalente.
408 - Criar form sem título que
possa ser arrastado
Problema:
Fazer um relógio num form é fácil. Porém gostaria que
esse orm não possuísse a barra de título, mas que o
usuário ainda pudesse arrastá-lo com o mouse. Isto é
possível no Delphi?
Solução:
Sim, é possível e é fácil. Siga os passos abaixo:
- Crie um novo projeto;
- Mude as seguintes propriedades do Form1:
- Coloque um Label;
- Coloque um Timer;
- Altere o evento OnTimer do Timer1 conforme abaixo:
procedure TForm1.Timer1Timer(Sender:
TObject);
begin
Label1.Caption := TimeToStr(Time);
end;
- Altere o evento OnCreate do Form1 conforme abaixo:
procedure TForm1.FormCreate(Sender:
TObject);
begin
Width := 80;
Height := 40;
Label1.Left := 10;
Label1.Top := 10;
end;
- Vá na seção private do Form1 e declare a procedure
abaixo:
private
procedure WMNCHitTest(var Msg:
TMessage);
message WM_NCHitTest;
public
{ Public declarations }
end;
- Vá na seção implementation e escreva a procedure
abaixo:
implementation
{$R *.DFM}
procedure TForm1.WMNCHitTest(var Msg:
TMessage);
begin
if GetAsyncKeyState(VK_LBUTTON) < 0 then
Msg.Result := HTCAPTION
else
Msg.Result := HTCLIENT;
end;
- Execute e experimente arrastar form com o mouse.
Observações
Para fechar este aplicativo pressione Alt+F4. Uma
alternativa mais elegante é colocar um menu local
(PopupMenu) com um comando para fechar.
409 - Definir data/hora de um
arquivo
Inclua na seção uses: SysUtils
{ Esta função altera a data e hora de um
arquivo. Se obter sucesso retorna true,
caso contrário retorna false. }
function DefineDataHoraArq(NomeArq:
string; DataHora: TDateTime): boolean;
var
F: integer;
begin
Result := false;
F := FileOpen(NomeArq, fmOpenWrite or
fmShareDenyNone);
try
if F > 0 then
Result := FileSetDate(F,
DateTimeToFileDate(DataHora)) = 0;
finally
FileClose(F);
end;
end;
{ Exemplo de uso 1: Usa a data atual do sistema (Now) }
if DefineDataHoraArq(‘c:\teste\logo.bmp’,
Now) then
ShowMessage(‘Data/Hora do arquivo
definida com sucesso.’)
else
ShowMessage(‘Não foi possível definir
data/hora do arquivo.’);
procedure TForm1.DBGridClick(Sender:
TObject);
begin
ShowMessage(‘Clicou no DBGrid.’);
end;
- Coloque as instruções abaixo no evento OnCreate do
Form:
procedure TForm1.FormCreate(Sender:
TObject);
begin
DBGrid1.ControlStyle :=
DBGrid1.ControlStyle + [csClickEvents];
TForm(DBGrid1).OnClick := DBGridClick;
end;
- E pronto. Execute e teste.
Observações
O segredo principal desta dica está OnCreate do Form.
A primeira instrução ativa o evento OnClick. A segunda
instrução acessa o manipulador do evento OnClick. Para
isto precisamos tratar o DBGrid como se fosse Form,
pois o evento OnClick está declarado como protegido
(protected) na classe TDBGrid.
413 - Criar caixas de diálogo em
tempo de execução
Inclua na seção uses: Forms, StdCtrls, Buttons
A função abaixo demonstra a criação de uma caixa de
diálogo que pode ser usada para permitir ao usuário
digitar o seu nome:
{ Esta função retorna true se for
pressionado OK e false em caso contrário.
Se for OK, o texto digitado pelo usuário
será copiado para a variável Nome }
function ObterNome(var Nome: string):
boolean;
var
Form: TForm; { Variável para o Form }
Edt: TEdit; { Variável para o Edit }
begin
Result := false; { Por padrão retorna
false }
{ Cria o form }
Form := TForm.Create(Application);
try
{ Altera algumas propriedades do Form }
Form.BorderStyle := bsDialog;
Form.Caption := ‘Atenção’;
Form.Position := poScreenCenter;
Form.Width := 200;
Form.Height := 150;
{ Coloca um Label }
with TLabel.Create(Form) do begin
Parent := Form;
Caption := ‘Digite seu nome:’;
Left := 10;
Top := 10;
end;
{ Coloca o Edit }
Edt := TEdit.Create(Form);
with Edt do begin
Parent := Form;
Left := 10;
Top := 25;
{ Ajusta o comprimento do Edit de acordo
com a largura do form }
Width := Form.ClientWidth - 20;
end;
{ Coloca o botão OK }
with TBitBtn.Create(Form) do begin
Parent := Form;
{ Posiciona de acordo com a largura do
form }
Left := Form.ClientWidth - (Width * 2) -
20;
Top := 80;
Kind := bkOK; { Botão Ok }
end;
{ Coloca o botão Cancel }
with TBitBtn.Create(Form) do begin
Parent := Form;
Left := Form.ClientWidth - Width - 10;
Top := 80;
Kind := bkCancel; { Botão Cancel }
end;
{ Exibe o form e aguarda a ação do
usuário. Se for OK… }
if Form.ShowModal = mrOK then begin
Nome := Edt.Text;
Result := true;
end;
finally
Form.Free;
end;
end;
Para chamar esta função siga o exemplo abaixo:
procedure TForm1.Button1Click(Sender:
TObject);
var
S: string;
begin
if ObterNome(S) then
Edit1.Text := S;
end;
Observações
Os componentes Label, Edit (var Edt) e BitBtn’s (botões)
não são destruídos explicitamente (Componente.Free).
Isto não é necessário, pois ao criá-los informei como
proprietário o Form (ex: TLabel.Create(Form)). Neste
caso, estes componentes são destruídos
automaticamente ao destruir o Form (Form.Free).
414 - Fechar um aplicativo com uma
mensagem de erro fatal
Inclua na seção uses: Windows
procedure TForm1.Button1Click(Sender:
TObject);
begin
FatalAppExit(0, ‘Erro fatal na
aplicação.’);
end;
Observações
A função FatalAppExit é uma API do Windows. Esta
mostra uma caixa de diálogo (normalmente branca) com
a mensagem passada no segundo parâmetro. Quando a
caixa de diálogo é fechada a aplicação é finalizada. O
evento OnCloseQuery dos forms não são chamados
quando usamos esta função.
415 - Criar um EXE que seja
executado apenas através de outro
EXE criado por mim
Inclua na seção uses: Windows
Problema:
Gostaria que um determinado programa (Prog1.EXE)
fosse executado apenas através de outro programa
(Prog2.EXE).
Solução:
Antes da linha “Application.Initialize;” de Prog1.dpr
(programa a ser chamado), coloque o código abaixo:
if ParamStr(1) <> ‘MinhaSenha’ then begin
{ Para usar ShowMessage, coloque Dialogs
no uses }
ShowMessage(‘Execute este programa
através de Prog2.EXE’);
Halt; { Finaliza }
end;
procedure TForm1.Button1Click(Sender:
TObject);
var
Erro: Word;
begin
Erro := WinExec(‘Pro2.exe MinhaSenha’,
SW_SHOW);
if Erro <= 31 then { Se ocorreu erro… }
ShowMessage(‘Erro ao executar o
programa.’);
end;
Observações
Aqui o parâmetro passado foi ‘MinhaSenha’. Você
deverá trocar ‘MinhaSenha’ por algo que apenas você
saiba (uma senha). Caso uma pessoa conheça esta
senha, será possível chamar este programa passando-a
como parâmetro. Neste caso sua “trava” estará violada.
416 - Resolver “Internal error
near: IBCheck” do Interbase 5.1.1
Server no NT
Recebi esta mensagem do desenvolvedor Alexsando S.
Pimenta.
Como deve ser do interesse de outros desenvolvedores,
coloquei-a aqui:
==== Mensagem original ====
Olá Daniel,
Anote está solução, muitos tem o mesmo problema mas
não conseguem a solução tão facilmente como eu.
Look:
Problema:
Estou com um problemão. Trabalho com o NT 4
workstation Service Pack 3, Delphi 3 e Interbase 4.2.xxx.
E instalei o Interbase 5.1.1 Server nesta máquina. Até aí
tudo bem. Quando fui rodar a aplicação deram alguns
problemas de conversão do tipo de Dado. Analisando o
problema percebi que havia esquecido de instalar o
Client do Interbase. Foi aí que começaram os
problemas. Tentei instalar o client, porém o instalador
após preparar os arquivos de instalação mostrava a
seguinte mensagem e parava : Titulo da janela =
“Severe”, mensagem = “Internal error near: IBCheck”;
comecei a ler os manuais, em certo ponto aconselhava
desinstalar qualquer versão posterior do Interbase da
minha máquina. Foi então que desinstalei o Interbase
4.2.xxx (através do “Control Panel”, “Add/Remove
Programs”). Nova tentativa de instalar o client, o erro
persistia. Resolvi desinstalar (através do “Control Panel”,
“Add/Remove Programs”) todo o Interbase da minha
máquina e começar tudo de novo. Porém quando tentei
instalar novamente o Interbase Server, surpresa, o erro
apareceu novamente. Mas agora não havia interbase
instalado. Fui desinstalando Delphi, BDE, … e nada.
Entrei no Regedit, pois o desinstalador, normalmente,
faz o trabalho incompleto e é necessário excluir um
monte de lixo do Registry. Deparei com a seguintes
chaves:
hkey_local_machine\system\controlset001\enum\root\leg
acy_interbase_guard
hkey_local_machine\system\controlset001\enum\root\leg
acy_interbase
Tentei excluí-las, porém são chaves protegidas, e o
regedit não permitiu que eu excluísse-as.
Poderiam me dar uma solução para eu poder instalar o
Interbase em minha máquina?
Preciso disto com urgência.
Obrigado,
Alexsandro Pimenta
Xenon Software Comércio e Serviços Ltda
apepper@uol.com.br
Solução:
Sr. Alexsandro,
Esse erro: ‘Internal error near: IBCheck’ acontece
apenas em algumas máquinas NT 4.
Na hora da instalação, é criada uma chave com valor
errado.
Entre no registry do Windows e altere a opção, PATH de
binário para string, da chave:
HKEY_CURRENT_USER\Environment
Renata Oliva
Inprise Support Center
417 - Obtendo uma data acrescida
de xMeses
Function SomaMes (dData : TDateTime;
xMeses : Integer; lCorrido : boolean) :
TDateTime;
var
Ano, Mes, Dia : word;
DataAux : TDateTime;
begin
DecodeDate(dData, Ano, Mes, Dia);
Mes := Mes + xMeses;
Ano := Ano + (Mes DIV 12);
Mes := Mes mod 12;
DataAux := MenorDataValida (Ano, Mes,
Dia);
if not lCorrido Then
DataAux := DataAux - 1;
SomaMes := DataAux;
end;
418 - Separar (filtrar) caracteres
de uma string
{ Abaixo da palavra implementation digite:
}
type
TChars = set of Char;
procedure TForm1.Button4Click(Sender:
TObject);
begin
{ Pega só letras }
ShowMessage(FilterChars(‘D63an*%i+/e68l13’
,
[‘A’..‘Z’, ‘a’..‘z’]));
{ Pega só números }
ShowMessage(FilterChars(‘D63an*%i+/e68l13’
, [‘0’..‘9’]));
end;
Observações
Se quizer usar este função em outras unit’s, coloque a
declaração do tipo TChars na seção interface. Coloque
aí também uma declaração da função FilterChars. E não
se esqueça da cláusula uses.
419 - Trabalhar com cores no
formato string
procedure TForm1.Button1Click(Sender:
TObject);
begin
{ Exibe as cores atuais dos Edit’s }
ShowMessage(ColorToString(Edit1.Color));
ShowMessage(ColorToString(Edit2.Color));
{ Altera as cores dos Edit’s }
Edit1.Color := StringToColor(‘clBlue’);
Edit2.Color :=
StringToColor(‘$0080FF80’);
end;
420 - Verificar se determinado
programa está em execução (Word,
Delphi, etc)
{ Coloque um Button no Form e altere o
evento OnClick deste como abaixo: }
procedure TForm1.Button1Click(Sender:
TObject);
begin
{ Verifica o Delphi }
if FindWindow(‘TAppBuilder’, nil) > 0
then
ShowMessage(‘O Delphi está aberto’)
else
ShowMessage(‘O Delphi NÃO está aberto’);
{ Verifica o Word }
if FindWindow(‘OpusApp’, nil) > 0 then
ShowMessage(‘O Word está aberto’)
else
ShowMessage(‘O Word NÃO está aberto’);
{ Verifica o Excell }
if FindWindow(‘XLMAIN’, nil) > 0 then
ShowMessage(‘O Excell está aberto’)
else
ShowMessage(‘O Excell NÃO está aberto’);
end;
Observações
Há uma margem de erro nesta verificação: pode haver
outros programas que possuam uma janela com os
mesmos nomes. Você mesmo pode criar aplicativos em
Delphi e, propositadamente, criar uma janela com um
destes nomes.
421 - Gerar uma tabela no Word
através do Delphi
Inclua na seção uses: ComObj
{ - Coloque um botão no Form;
- Altere o evento OnClick do botão
conforme abaixo: }
procedure TForm1.Button1Click(Sender:
TObject);
var
Word: Variant;
begin
{ Abre o Word }
Word :=
CreateOleObject(‘Word.Application’);
try
{ Novo documento }
Word.Documents.Add;
try
{ Adiciona tabela de 2 linhas e 3
colunas }
Word.ActiveDocument.Tables.Add(
Range := Word.Selection.Range,
NumRows := 2,
NumColumns := 3);
{ Escreve na primeira célula }
Word.Selection.TypeText(Text := ‘Linha
1, Coluna 1’);
{ Próxima célula }
Word.Selection.MoveRight(12);
{ Escreve }
Word.Selection.TypeText(Text := ‘Linha
1, Coluna 2’);
Word.Selection.MoveRight(12);
Word.Selection.TypeText(Text := ‘Linha
1, Coluna 3’);
Word.Selection.MoveRight(12);
Word.Selection.TypeText(Text := ‘Linha
2, Coluna 1’);
Word.Selection.MoveRight(12);
Word.Selection.TypeText(Text := ‘Linha
2, Coluna 2’);
Word.Selection.MoveRight(12);
Word.Selection.TypeText(Text := ‘Linha
2, Coluna 3’);
{ Auto-Formata }
Word.Selection.Tables.Item(1).Select; {
Seleciona a 1º tabela }
Word.Selection.Cells.AutoFit; { auto-
formata }
{ Imprime 1 cópia }
Word.ActiveDocument.PrintOut(Copies :=
1);
ShowMessage(‘Aguarde o término da
impressão…’);
{ Para salvar… }
Word.ActiveDocument.SaveAs(FileName :=
‘c:\Tabela.doc’);
finally
{ Fecha documento }
Word.ActiveDocument.Close(SaveChanges :=
0);
end;
finally
{ Fecha o Word }
Word.Quit;
end;
end;
Observações
Foram usados neste exemplo o Delphi4 e MS-Word97.
422 - Obter a quantidade de
registros total e visível de uma
tabela
Inclua na seção uses: DbiProcs
Os componentes TTable e TQuery possuem a
propriedade RecordCount que indicam a quantidade de
registros da tabela.
No entanto esta propriedade é dependente de filtros, ou
seja, se tivermos uma tabela com dez registros com
campo “Codigo” de 1 a 10 e aplicarmos o filtro mostrado
a seguir, a propriedade RecordCount retornará 5 e não
10.
Table1.Filter := ‘Codigo <= 5’;
Table1.Filtered := true;
Se quizermos obter a quantidade total de registros,
independentemente de filtros, devemos usar uma API do
BDE conforme abaixo:
var
Total: integer;
begin
Check(DbiGetRecordCount(Table1.Handle,
Total));
ShowMessage(‘Total de registros: ‘ +
IntToStr(Total));
end;
Observações
Para testar o exemplo acima, o Table1 precisa estar
aberto.
423 - Salvar/restaurar o tamanho e
posição de Form’s
{ Crie uma nova Unit conforme abaixo: }
unit uFormFunc;
interface
uses Forms, IniFiles, SysUtils, Messages,
Windows;
implementation
program Project1;
uses
Forms, Controls,
Unit1 in ‘Unit1.pas’ {Form1},
Unit2 in ‘Unit2.pas’ {Form2};
{$R *.RES}
var
F: TForm2;
begin
F := TForm2.Create(Application);
try
if F.ShowModal = mrOK then begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
finally
F.Free;
end;
end.
Observações
O Form2 do exemplo é o Form de LogOn. Este deverá
ser preparado para que se possa escolher o usuário,
digitar a senha, etc.
426 - Saber se a impressora atual
possui determinada fonte
Inclua na seção uses: Printers
{ Coloque este código no OnClick de um
botão }
with Printer.Fonts do
if IndexOf(‘Draft 10cpi’) >= 0 then
ShowMessage(‘A impressora possui a
fonte.’)
else
ShowMessage(‘A impressora NÃO possui a
fonte.’);
Observações
Isto pode ser útil quando queremos usar fonte da
impressora quando for uma matricial ou fonte do
Windows quando for uma Jato de Tinta ou Laser.
427 - Saber se determinada Font
está instalada no Windows
{ Coloque este código no OnClick de um
botão }
with Screen.Fonts do
if IndexOf(‘Courier New’) >= 0 then
ShowMessage(‘A fonte está instalada.’)
else
ShowMessage(‘A fonte não está
instalada.’);
428 - Como importar dados de um
arquivo texto para uma Tabela
var
sArquivo: TextFile;
Entrada, sArq2: string;
iLinha: integer;
begin
tblCep.Open;
tblCepLoc.Open;
bCancelaImport := False;
AssignFile(sArquivo,
FileNameEdit1.FileName);
sArq2 :=
After(‘Cep_Loc.txt’,FileNameEdit1.FileName
);
iLinha := 0;
if FileNameEdit1.FileName =
‘C:\Download\Ceps\Cep_loc.txt’ then begin
// Arquivo de Localidades
RzProgressBar1.TotalParts := 0;
RzProgressBar1.TotalParts :=
NumLinhasArq(FileNameEdit1.FileName);
Reset(sArquivo);
Readln(sArquivo,Entrada);
while not Eoln(sArquivo) do begin
Inc(iLinha);
Readln(sArquivo,Entrada);
Procedure LoadGrid;
var
f:textfile;
temp,x,y:integer;
tempstr:string;
begin
assignfile (f,‘NomeArquivo’);
reset (f);
readln (f,temp);
stringgrid.colcount:=temp;
readln (f,temp);
stringgrid.rowcount:=temp;
For X:=0 to stringgrid.colcount-1 do
For y:=0 to stringgrid.rowcount-1 do
begin
readln (F, tempstr);
stringgrid.cells[x,y]:=tempstr;
end;
closefile (f);
end;
448 - Retirando acentos de uma
string
function RemoveAcento(Str:String): String;
Const
ComAcento =
‘àâêôûãõáéíóúçüÀÂÊÔÛÃÕÁÉÍÓÚÇÜ’;
SemAcento =
‘aaeouaoaeioucuAAEOUAOAEIOUCU’;
Var
x : Integer;
Begin
For x := 1 to Length(Str) do
if Pos(Str[x],ComAcento)<>0 Then
Str[x] :=
SemAcento[Pos(Str[x],ComAcento)];
Result := Str;
end;
449 - Removendo a barra de
rolagem vertical do DBGrid
Para remover a barra de rolagem vertical de
componente TDBGrid, você precisa apenas criar um
novo componente herdado da classe TDBGrid e
reescrever o método paint.
No método Paint você usará a API do Windows
SetScrollRange definindo o tamanho máximo e mínimo
do scroll para zero (isto desabilitará a exibição da barra
de scroll).
E então acione o inherited paint para que o objeto novo
possa ser desenhado.
O código abaixo mostra uma Unit criada de uma
instância do componente TDBGrid e que não possui a
barra de rolagem vertical.
unit Newgrid;
interface
uses
WinTypes, WinProcs, Classes, DBGrids;
type
TNoVertScrollDBGrid = class(TDBGrid)
protected
procedure Paint; override;
end;
procedure Register;
implementation
procedure TNoVertScrollDBGrid.Paint;
begin
SetScrollRange(Self.Handle, SB_VERT, 0, 0,
False);
inherited Paint;
end;
procedure Register;
begin
RegisterComponents(‘Data Controls’,
[TNoVertScrollDBGrid]);
end;
end.
450 - Como reduzir o tempo e
carga de um programa
É comum acontecer um sensível aumento do tempo de
carga de um aplicativo desenvolvido em Delphi à
medida que este aplicativo cresce e adquire mais e mais
formulários. Às vezes o tempo de carga se torna
totalmente insuportável.
Os programas se tornam lentos principalmente devido à
grande quantidade de formulários que são criados e
inicializados logo no início da execução do programa.
Antes de ser efetivamente utilizado, todo formulário
precisa ser criado. A criação do formulário
Sempre que você adiciona um novo formulário ao
sistema, o IDE do Delphi providencia código para que
ele seja criado automaticamente. Isto simplifica a vida
do programador que não precisará se preocupar com
este detalhe.
O aumento do tempo de carga do aplicativo pode ser
resolvido pela simples remoção do código que o Delphi
gerou para a criação do formulário. Entretanto isto cria
um problema. Antes de efetivamente mostrar o
formulário na tela (ou antes de usar e/ou altera
Para remover o código que o Delphi criou
automaticamente, selecione Project|Options no menu.
Selecione a aba ‘Forms’. Aponte para um dos
formulários e clique no botão ‘>’. Isto faz com que o
formulário passe do painel ‘Auto-create forms’ para o
painel ‘Av
Se você quer saber onde está este código, clique em
View|Units (ou use Ctrl-F12) e selecione o seu projeto
na lista de units que aparecerá. O código que cria
formulários é algo mais ou menos como se segue:
Application.CreateForm(TForm1, Form1);
Cada formulário auto-criado terá uma linha como esta.
Quando o formulário passa para o painel de ‘Available
forms’, a linha correspondente é removida. Você
também pode simplesmente remover a linha
manualmente, usando o editor de textos.
Tipicamente usar um formulário significa mostrá-lo na
tela. Isto é feito invocando-se os métodos Show ou
ShowModal do formulário conforme o estilo do
aplicativo. Agora que o formulário não é mais criado
automaticamente, isto se torna um pouco mais complic
if Form1 = nil then
Form1 := TForm1.Create ( Application );
Form1.Show; { ou Form1.ShowModal; }
Alternativamente você poderia escrever assim:
if Form1 = nil then
Application.CreateForm ( TForm1, Form1 );
Form1.Show; { ou Form1.ShowModal; }
O efeito é o mesmo, mas eu, pessoalmente, prefiro a
primeira forma.
Você deve ter extremo cuidado ao usar esta técnica. Se
você tirar o código de criação automática do formulário e
tentar executar o Show ou ShowModal você vai receber
um erro do tipo ‘Access violation’. Tome cuidado e faça
isto um formulário por vez.
Atenção! Não faça isto para o seu formulário principal. O
formulário principal precisa ser o primeiro formulário a
ser criado. Assim é melhor mantê-lo como auto-criado.
Esta técnica efetivamente ‘distribui’ o tempo de carga e
inicialização do aplicativo pela execução do programa.
Os formulários agora são carregados ‘sob-demanda’.
Formulários nunca utilizados nunca serão criados. Isto
também melhora o uso de memória.
451 - Obtendo o próximo dia útil
caso a data informada caia em um
fim de semana
Function ProximoDiaUtil (dData :
TDateTime) : TDateTime;
begin
if DayOfWeek(dData) = 7 then
dData := dData + 2
else
if DayOfWeek(dData) = 1 then
dData := dData + 1;
ProximoDiaUtil := dData;
end;
452 - Obtendo o último dia útil
caso a data informada caia em um
fim de semana
Function DiaUtilAnterior (dData :
TDateTime) : TDateTime;
begin
if DayOfWeek(dData) = 7 then
dData := dData - 1
else
if DayOfWeek(dData) = 1 then
dData := dData - 2;
DiaUtilAnterior := dData;
end;
453 - Obtendo o nº de ocorrências
de uma string ‘T’ dentro de outra
‘S’
Function Occurs(T, S : ShortString) :
Byte;
Var
P : Byte;
Begin
Result := 0;
P := Pos (T, S);
while P > 0 do
begin
Inc (Result);
S := Copy (S, P + Length (T), 255);
P := Pos (T, S);
end;
End;
454 - Obtendo o nome das tabelas
de um determinado alias
procedure TForm1.Button1Click(Sender:
TObject);
begin
try
S := TStringList.Create;
GetTableNames(‘Nome_do_Alias’,’*.db’,False
, False, S);
Memo1.Text:=S.Text;
finally
S.Free;
end;
end;
455 - Obtendo o indice de um
componente em tempo de execução
function IndexInParent(vControl:
TControl): integer;
var
ParentControl: TWinControl;
begin
ParentControl := TForm(vControl.Parent);
if (ParentControl <> nil) then
begin
for Result := 0 to
ParentControl.ControlCount - 1 do
begin
if (ParentControl.Controls[Result] =
vControl) then Exit;
end;
end;
Result := -1;
end;
456 - Obtendo o extenso do mês
passado por parâmetro
Function MesExtenso (xMes : Variant) :
string;
Var
Dia, Mes, Ano : Word;
begin
Mes := 0;
Case VarType (xMes) of
VarDate : DecodeDate (xMes, Ano, Mes,
Dia);
VarString :
Try
Mes := StrToInt (xMes);
Except
End;
else
Try
Mes := Round (xMes);
Except
End;
end;
case Mes of
1: Result := ‘Janeiro’;
2: Result := ‘Fevereiro’;
3: Result := ‘Março’;
4: Result := ‘Abril’;
5: Result := ‘Maio’;
6: Result := ‘Junho’;
7: Result := ‘Julho’;
8: Result := ‘Agosto’;
9: Result := ‘Setembro’;
10: Result := ‘Outubro’;
11: Result := ‘Novembro’;
12: Result := ‘Dezembro’;
else
Result := ”;
end;
end;
457 - Obtendo o extenso de uma
data informada
Function DataExtenso (dData : TDateTime) :
string;
var
Ano, Mes, Dia : word;
begin
DecodeDate(dData, Ano, Mes, Dia);
DataExtenso := StrZero(Dia,2,0) + ‘ de ‘ +
MesExtenso(Mes) + ‘ de ‘ + IntToStr(Ano);
end;
procedure TForm1.Button1Click(Sender:
TObject);
var
S : TStringList;
Ver : SYSVersion;
begin
S:=TStringList.Create;
Ver:=VersaoBDE(S);
Memo1.Text:=S.Text;
end;
460 - Obtendo a versão da tabela
unit Dbutils;
interface
uses
DbTables;
function DbGetVersion(table: TTable):
LongInt;
implementation
uses
Db, DbiProcs, DbiTypes, {DbiErrs,}
SysUtils
function DbGetVersao(table: TTable):
LongInt;
var
hCursor : hDBICur;
tableDesc: TBLFullDesc;
cName : array[0..255] of Char;
begin
{ make c-string copy table name }
StrPCopy(cName, table.TableName);
Check(DbiOpenTableList(table.DBHandle,
True, False, cName, hCursor));
Check(DbiGetNextRecord(hCursor, dbiNOLOCK,
@tableDesc, nil));
Result := tableDesc.tblExt.iRestrVersion;
Check(DbiCloseCursor(hCursor));
end;
end.
461 - Obtendo a próxima palavra
após os espaços determinados por
‘BlankToSkip’
Function NextWord (S : ShortString;
BlankToSkip, Mode : Byte) : ShortString;
Var
PosAnt, PosFin : Integer;
Begin
if Mode = mdAscend Then
PosFin := 1
else
PosFin := Length (S);
Inc (BlankToSkip);
Repeat
PosAnt := PosFin;
PosFin := NextPosWord (S, PosFin, Mode);
Dec (BlankToSkip);
Until (BlankToSkip = 0) or (PosFin = 0);
if BlankToSkip > 0 Then
Result := ”
else
begin
if PosFin = 0 Then
if Mode = mdAscend Then
PosFin := Length (S) + 1;
if Mode = mdAscend Then
Result := StripChar (Copy (S, PosAnt,
PosFin - PosAnt), EspacoBranco,
ReplaceRight)
else
Result := StripChar (Copy (S, PosFin + 1,
PosAnt - PosFin), EspacoBranco,
ReplaceLeft);
end;
End;
462 - Obtendo a Posição Inicial da
Próxima palavra após o caracter
indicado por ‘InitPos’
Function NextPosWord (S : ShortString;
InitPos, Mode : Byte) : Byte;
Var
I : Integer;
Begin
InitPos := Min (Max (InitPos, 1),
Length(S));
if Mode = mdDescend Then
I := -1
else
I := 1;
while ((InitPos <= Length(S)) And (InitPos
> 0) And (S[InitPos] <> ‘ ‘)) Do
Inc (InitPos, I);
while ((InitPos <= Length(S)) And (InitPos
> 0) And (S[InitPos] = ‘ ‘)) Do
Inc (InitPos, I);
if InitPos > Length (S) Then
InitPos := 0;
NextPosWord := InitPos;
End;
463 - Obtendo a posição da
enésima ocorrência da string ‘T’ na
string ‘S’
Function OccurPos (T, S : ShortString; N :
Byte) : Byte;
Var
Op, P, I : Byte;
Begin
I := 0;
Op := 0;
P := Pos (T, S);
While P > 0 Do
Begin
Inc (Op);
if Op = N Then
Begin
OccurPos := I + P;
Exit;
End;
Inc(I, P + Length(T) - 1);
P := Pos (T, Copy (S, I + 1, 255));
End;
OccurPos := 0;
end;
464 - Obtendo a maior data
anterior a uma data inválida
Function MenorDataValida (Ano, Mes, Dia :
Word) : TDateTime;
Var
Continua : Boolean;
DataAux : TDateTime;
begin
Continua := True;
DataAux := date;
while Continua do
Try
DataAux := EncodeDate (Ano, Mes, Dia);
Continua := False;
Except
Dec (Dia);
End;
MenorDataValida := DataAux;
end;
465 - Obtendo a lista de Aliases
disponíveis
Tudo que você precisa é de um componente TSession,
TListBox e uma StringList.
Defina a propriedade SessionName do TSession para
‘Session’.
Utilize o seguinte código:
procedure TForm1.Button1Click(Sender:
TObject);
var
MyStringList: TStringList;
i: integer;
begin
MyStringList := TStringList.Create;
Session.GetAliasNames(MyStringList);
for I := 0 to MyStringList.Count - 1 do
ListBox1.Items.Add(MyStringList[I]);
end;
Utilize o Help do TSession e consulte seus métodos
para ver por exemplo como capturar o diretório ou
caminho de um Alias com o método ‘GetAliasParams’.
Contruibuição do Claudio
// Procedure Modificada
SetPriorityClass(GetCurrentProcess,
REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,THREAD_
PRIORITY_TIME_CRITICAL);
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
SetThreadPriority(GetCurrentThread,
Priority);
SetPriorityClass(GetCurrentProcess,
PriorityClass);
Atual:=StrPos(Atual+lenoldstring,StrtoFind
);
end; //Atual<>nil
Result:=NewText;
end; //ReplaceStr
502 - Abrir tabelas paradox
protegidas por senha
Existem diversos aplicativos na internet capazes de
descobrir as senhas de tabelas paradox a partir de um
erro das tabelas… mas pra que usar um aplicativo
desses se vc pode usar estas senhas masters que
funcionam com qualquer tabela paradox protegida por
senha!!
Para PARADOX 7.0 -> “jIGGAe” ou “cupcdvum”
Para PARADOX 5.0 -> “jIGGAe” ou “cupcdvum”
Para PARADOX 4.0 (DOS) -> “nx66ppx”
Aproveitem!
503 - Drag e Drop com o Windows
Explorer
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms,
Dialogs, ComCtrls;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
PROCEDURE FileIsDropped ( VAR Msg :
TMessage ) ; Message WM_DropFiles ;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
shellapi;
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
begin
DragAcceptFiles( Handle,True ) ;
end;
ShowMessage(‘Selecionados
‘+IntToStr(NumberOfFiles) + ‘ Nomes : ‘ +
Names );
DragFinish ( hDrop);
end;
504 - Mudando o texto de um edit
no evento OnChange
Se o texto de um TEdit for mudado no seu evento
OnChange, este even-to será chamado recursivamente
até acabar com o espaço de pilha. Pa-ra fazer isso,
deve-se setar o evento OnChange para NIL antes de
mu-dar o texto, voltando ao original depois, desta
maneira:
procedure Edit1Change(Sender : TObject);
begin
Edit1.OnChange := NIL;
if Edit1.Text = ‘Texto’ then
Edit1.Text := ‘Novo Texto’;
Edit1.OnChange := Edit1Change;
end;
Esta dica também vale para evento OnValidate.
505 - Desabilitando um RadioButton
Num RadioGroup
TRadioButton(RadioGroup1.Controls[1]).Enab
led := False;
506 - Obter o tipo de um drive
Inclua na seção uses: Windows, Dialogs
{ - Coloque um edit (Edit1) e um botão no
form;
- Altere o OnClick do botão conforme
abaixo: }
procedure TForm1.Button1Click(Sender:
TObject);
var
S: string;
Tipo: byte;
begin
Tipo := GetDriveType(PChar(Edit1.Text[1] +
‘:'));
case Tipo of
0: S := ‘Tipo indeterminado’;
1: S := ‘Drive não existe’;
DRIVE_REMOVABLE: S := ‘Disco removível’;
DRIVE_FIXED: S := ‘Disco Fixo’;
DRIVE_REMOTE: S := ‘Unidade de rede’;
DRIVE_CDROM: S := ‘CD-ROM’;
DRIVE_RAMDISK: S := ‘RAM Disk’;
else
S := ‘Erro’;
end;
ShowMessage(S);
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
TipoConexao;
end;
type
vetor_dinamico = array of TAluno;
var
vetor_aluno: vetor_dinamico;
515 - Tipos de Array
Um array é uma coleção ordenada de elementos do
mesmo tipo de dados, que faz uso de um índice para
dar acesso aos items da coleção. Arrays são úteis em
diversas situações. Como o índice permite acesso direto
aos elementos da lista, arrays fornecem um poderoso
mecanismo para se organizar dados. O exemplo a
seguir mostra como declarar uma array :
EXEMPLO 1:
Procedure Tform1.Button1Click (Sender:
Tobject) ;
var
Dias_de_Semana: array[1..7] of String ;
var
DiaNo: Integer;
DiadaSemana: String;
begin
Para resolver:
Crie uma nova Aplicação (File | New Application)
Acrescente um ListBox
Acrescente um Button
Dê dois cliques sobre o Button e acrescente o código :
procedure TForm1.Button1Click(Sender:
TObject);
var
ElasList : array[1..4] of String [10] ;
ElesList : array[1..4] of String[10];
i , j : integer;
begin
ElasList[1] := ‘Juliana’ ;
ElasList[2] := ‘Natália’ ;
ElasList[3] := ‘Carolina’ ;
ElasList[4] := ‘Adriana’ ;
ElesList[1] := ‘Guilherme’ ;
ElesList[2] := ‘Neto’ ;
ElesList[3] := ‘Leonardo’ ;
ElesList[4] := ‘Eduardo’ ;
for i:=1 to 4 do
for j:=1 to 4 do
ListBox1.Items.Add(ElasList[i] + ‘
‘+ElesList[j]);
end;
end.
520 - Atribuindo a uma coluna do
StringGrid como só de leitura
if Col mod 2 = 0 then
grd.Options := grd.Options + [goEditing]
else
grd.Options := grd.Options - [goEditing];
521 - Chamar um programa e
esperar a finalização
Para executar um programa e esperar até esse
programa finalizar, use a rotina abaixo:
function Executa (Arquivo : String; Estado
: Integer) : Integer;
var
Programa : array [0..512] of char;
CurDir : array [0..255] of char;
WorkDir : String;
StartupInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
StrPCopy (Programa, Arquivo);
GetDir (0, WorkDir);
StrPCopy (CurDir, WorkDir);
FillChar (StartupInfo, Sizeof
(StartupInfo), #0);
StartupInfo.cb := sizeof (StartupInfo);
StartupInfo.dwFlags :=
STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Estado;
if not CreateProcess (nil, Programa, nil,
nil, false, CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS, nil, nil,
StartupInfo, ProcessInfo) then
Result := -1
else
begin
WaitForSingleObject (ProcessInfo.hProcess,
Infinite);
GetExitCodeProcess (ProcessInfo.hProcess,
Result);
end;
end;
Estado é o tipo de janela que aparecerá, que pode ser:
SW_SHOWNORMAL
Janela em modo normal
SW_MAXIMIZE
Janela maximizada
SW_MINIMIZE
Janela minimizada
SW_HIDE
Janela Escondida
522 - Colocar o cursor no final do
TEdit ao receber o foco
No evento OnEnter do TEdit coloque:
procedure TForm1.Edit1Enter(Sender:
TObject);
begin
Edit1.Selstart:= Length(Edit1.text);
end;
523 - Convertendo um número real
para string com 2 casas
ValorReal : Real;
ValorString : String;
ValorReal := 5;
ValorString :=
floattostrf(ValorReal,ffFixed,18,2);
524 - Como acrescentar dias uteis
a uma data
function Datafinal(dataini:tdatetime;
dias_uteis:integer):tdatetime;
//
// Retorna uma data acresçida de mais um
certo número de dias
// uteis descontando os fins de semana
//
var dw:integer;
begin
dw := DayOfWeek(dataini)-1;
result := dataini+dias_uteis+
((dias_uteis-1+dw) div 5)*2;
end;
525 - Como converter de decimal
para binario
function DecToBinStr(n: integer): string;
{Converte um numero decimal em binário}
var
S: string;
i: integer;
Negative: boolean;
begin
if n < 0 then
begin
Negative := true;
end;
n := Abs(n);
for i := 1 to SizeOf(n) * 8 do
begin
if n < 0 then
begin
S := S + ‘1’;
end
else
begin
S := S + ‘0’;
end;
n := n shl 1;
end;
Delete(S,1,Pos(‘1’,S) - 1);//remove
leading zeros
if Negative then
begin
S := ‘-‘ + S;
end;
Result := S;
end;
526 - Como converter decimal para
base especificada
function DecToBase( Decimal: LongInt;
const Base: Byte): String;
{converte um número decimal na base
especificada}
const
Symbols: String[16] =
‘0123456789ABCDEF’;
var
scratch: String;
remainder: Byte;
begin
scratch := ”;
repeat
remainder := Decimal mod Base;
scratch := Symbols[remainder + 1] +
scratch;
Decimal := Decimal div Base;
until ( Decimal = 0 );
Result := scratch;
end;
527 - Como converter decimal para
romanos
function DecToRoman( Decimal: LongInt ):
String;
{Converte um numero decimal em algarismos
romanos}
const
Romans: Array[1..13] of String = ( ‘I’,
‘IV’, ‘V’, ‘IX’, ‘X’, ‘XL’, ‘L’, ‘XC’,
‘C’, ‘CD’, ‘D’, ‘CM’, ‘M’ );
Arabics: Array[1..13] of Integer =( 1, 4,
5, 9, 10, 40, 50, 90, 100, 400, 500, 900,
1000);
var
i: Integer;
scratch: String;
begin
scratch := ”;
for i := 13 downto 1 do
while ( Decimal >= Arabics[i] ) do
begin
Decimal := Decimal - Arabics[i];
scratch := scratch + Romans[i];
end;
Result := scratch;
end;
528 - Como desconectar unidade de
rede
Function
DesconectaRede(Letra:Pchar;Forcada:boolean
):String;
//
// Disconecta uma unidade mapeada via
programação
//
// Letra = Letra atribuida a unidade
// Forcada = Força o cancelamento do
mapeamento
//
begin
WNetCancelConnection2(Letra,0,Forcada);
Case GetLastError() of
1205: Result := ‘Não foi possível abrir
o perfil’;
1206: Result := ‘Perfil do usuário não
encontrado ou inválido’;
1208: Result := ‘Ocorreu um Erro
específico na rede’;
2138: Result := ‘Rede não encontrada ou
fora do ar’;
2250: Result := ‘Mapeamento inválido ou
não encontrado’;
2401: Result := ‘Existem muitos arquivos
abertos’;
else
Result := ‘Unidade disconectada com
sucesso’;
end;
end;
529 - Diferença entre duas horas
function DifHora(Inicio,Fim :
String):String;
{Retorna a diferença entre duas horas}
var
FIni,FFim : TDateTime;
begin
Fini := StrTotime(Inicio);
FFim := StrToTime(Fim);
If (Inicio > Fim) then
begin
Result :=
TimeToStr((StrTotime(‘23:59:59’)-
Fini)+FFim)
end
else
begin
Result := TimeToStr(FFim-Fini);
end;
end;
Observação incluída por um dos
usuários da DTDelphi sobre a dica
Acima:
Olá, meu nome é Paulo e já parabenizo pelas dicas
disponíveis em Delphi, que ajudam todos os
programadores desta linguagem.
Result := TimeToStr((StrTotime(‘23:59:59’)
+ StrToTime(‘00:00:01’) -Fini)+FFim
{Memo1.Lines.Add(Dir+Separator+SearchRec.N
ame);}
end
else if
DirectoryExists(Dir+Separator+SearchRec.Na
me) then
begin
if (SearchRec.Name<>’.’) and
(SearchRec.Name<>’..’) then
begin
DirSize(Dir+Separator+SearchRec.Name);
end;
end;
while FindNext(SearchRec) = 0 do
begin
if
FileExists(Dir+Separator+SearchRec.Name)
then
begin
DirBytes := DirBytes + SearchRec.Size;
{Memo1.Lines.Add(Dir+Separator+SearchRec.N
ame);}
end
else if
DirectoryExists(Dir+Separator+SearchRec.Na
me) then
begin
if (SearchRec.Name<>’.’) and
(SearchRec.Name<>’..’) then
begin
DirSize(Dir+Separator+SearchRec.Name);
end;
end;
end;
end;
FindClose(SearchRec);
end;
531 - Eliminar Caracteres de
Strings
function EliminaCaracteres (sTexto:
String; sCaracteres:Set of Char):String;
{Elimina de sTexto todos os caracteres
passados como parametro}
var
nPos, nTam: Integer;
begin
Result := ”;
nPos := 1;
nTam := Lenght(sTexto);
while nPos <= nTam do
begin
if not (sTexto[nPos] in sCaracteres)
then Result := Result +sTexto[nPos]
end;
end;
532 - Verificar se variavel está
vazia
function Empty(inString:String): Boolean;
{Testa se a variavel está vazia ou não}
Var
index : Byte;
Begin
index := 1;
Empty := True;
while (index <= Length(inString))and
(index <> 0) do
begin
if inString[index] = ‘ ‘ Then
begin
inc(index)
end
else
Begin
Empty := False;
index := 0
end;
end;
end;
533 - Executar o Windows Explorer
com parametros
function ExecExplorer(OpenAtPath: string;
OpenWithExplorer, OpenAsRoot: Boolean):
boolean;
//
// Executa o Windows Explorer a partir de
uma pasta
// especificada
//
// Requer a unit ShellApi
//
// ex: execExplorer(‘C:\Temp’, True,True);
//
var
s: string;
begin
if OpenWithExplorer then
begin
if OpenAsRoot then
s := ‘ /e,/root,”’ + OpenAtPath + ‘”’
else
s := ‘ /e,”’ + OpenAtPath + ‘”’;
end
else
s := ‘”’ + OpenAtPath + ‘”’;
result :=
ShellExecute(Application.Handle,PChar(‘ope
n’),PChar(‘explorer.exe’),PChar(s),nil,SW_
NORMAL) > 32;
end;
534 - Como Esvaziar uma Tabela
function EsvaziaTabela(Tabela : TTable):
Boolean;
// Esvazia a tabela passada como parametro
var
lExclusivo : boolean;
begin
Tabela.Active := False;
repeat
try
Tabela.Exclusive := True;
Tabela.Active := True;
Tabela.EmptyTable;
lExclusivo := True;
Break;
except
on EDatabaseError do
if MessageDlg(‘A tabela está sendo usada
por outro usuário. Tenta novamente ?’,
mtError,[mbOK, mbCancel], 0) <> mrOK then
begin
lExclusivo := False;
raise;
end;
end;
until False;
Result := lExclusivo;
end;
535 - Pegar informações de
Executavel
function FileVerInfo(const FileName:
string;var FileInfo: TStringList):
Boolean;
//
// Obtem diversas informações de um
arquivo executável
//
// Requer um StringList criado antes de
executar a função
// deve ser declarado na clausula Var no
inicio da Unit
// StrLst := TStringList.Create;
//
//
const
{
COMO FUNCIONA!
Todas as informações sobre o modem
instalado estão contidas no registro do
Windows. Usando TRegistry podemos,
facilmente, ter acesso à essas
informações. Porém, dependendo do modem,
ele pode não especificar em qual porta
está instalado. Então devemos primeiro
descobrir quantas portas serial existem no
sistema, criar um Handle para receber a
Porta e depois fazer tentativas de
abertura em cada uma delas no modo
Leitura/Escrita (GENERIC_READ or
GENERIC_WRITE). Se tentarmos, por exemplo,
abrir a COM1 (que, geralmente, está o
mouse), não conseguiremos abrí-la e
retornará erro (INVALID_HANDLE_VALUE).
Podemos então manipular o retorno. A forma
ideal é criar um loop para que todas as
portas sejam checadas.
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms,
Dialogs,StdCtrls, Registry;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Button1: TButton;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure PegaModem(porta: string);
procedure ComboBox1Change(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.PegaModem(porta :
string);
var
FHandle : THandle;
Reg : TRegistry;
Lista : TStrings;
i : integer;
varPorta, varModelo : string;
begin
Reg :=TRegistry.Create;
//Procurar na secção…
Reg.RootKey :=HKEY_LOCAL_MACHINE;
procedure TForm1.Button1Click(Sender:
TObject);
begin
Close;
end;
procedure TForm1.FormCreate(Sender:
TObject);
var
porta : string;
begin
Combobox1.Clear;
PegaModem(porta);
end;
procedure TForm1.ComboBox1Change(Sender:
TObject);
var
porta : string;
begin
//Verificar se existe mais de um modem…
porta := combobox1.text;
PegaModem(porta);
end;
end.
550 - Nome da Impressora Padrão
function GetDefaultPrinterName : string;
//
// Retorna o nome da impressora padrão do
Windows
//
begin
if(Printer.PrinterIndex >= 0)then
begin
Result :=
Printer.Printers[Printer.PrinterIndex];
end
else
begin
Result := ‘Nenhuma impressora Padrão foi
detectada’;
end;
end;
551 - Verificar se Impressora esta
Conectada
A dica abaixo apresenta o código para implementação
de uma função para verificar se a impressora esta
conectada.
Para implementar esta função é necessário que o
código gerado manipule algumas interrupções da Bios
(Sistema Básico de Entrada e Saída) responsáveis pelo
controle da porta paralela (Interrupção $17).
A interrupção $17 utiliza dois registros ah e dx, o
registrador ah indica neste caso o acesso a porta
paralela e o registrador dx indica qual das portas será
testada, 0 para LPT1 e 1 para LPT2.
Para saber se a porta esta ligada (impressora
conectada) o resultado da operação de tratamento de
interrupção deve ser $80.
Código Completo:
Function OnLine(Porta:Word):Boolean;
Const
Portas :Byte = $02;
Var
Res :Byte;
Begin
{ Código em Assembler }
Asm
mov ah,Portas; {Requisita o acesso as
portas}
mov dx,Porta;{Define a porta de teste}
Int $17; {Chama a interrupção de
Impressora}
mov Res,ah; {Guarda em Res o resultado da
operação }
end;
Result := (Res and $80) = $80; {Testa o
valor de saída}
End;
552 - Exibindo as propriedades do
arquivo
A dica abaixo apresenta o código de implementação
para exibir na tela uma janela padrão Windows de
propriedades do arquivo.
Para implementar este procedimento é necessário
acrescentar a unit ShellAPI.As propriedades do arquivo
são armazenadas numa estrutura chamada
TShellExecuteInfo, que corresponde a um registro com
os campos: tamanho do arquivo (cbSize), atributos
(fMask), nome (lpFile) , shell (lpVerb) e modo de
apresentação da janela (nShow).O primeiro passo do
procedimento é zerar todas a propriedades da Shell (
FillChar(S,SizeOf(S),0) ), segundo passo é atualizar
estas propriedades (With S do ) em relação ao arquivo
indicado (Arq :String) e o terceiro passo é abrir a janela
de propriedades com os valores atualizados
(ShellExecuteEx(@S)).
Código Completo:
Procedure Propriedades(Arq:String);
Var
s:TShellExecuteInfo;
Begin
FillChar(S,SizeOf(S),0);
With S do Begin
cbSize := SizeOf(S);
fMask := SEE_MASK_FLAG_NO_UI or
SEE_MASK_INVOKEIDLIST or
SEE_MASK_NOCLOSEPROCESS;
wnd := Handle;
lpVerb := ‘properties’;
lpFile := Pchar(Arq);
nShow := sw_ShowNormal;
End;
ShellExecuteEx(@S);
End;
553 - Dicas Práticas
Incluir componentes.
Ao teclar “Alt”+“V” e posteriormente “C” será
apresentada a janela com a lista de componentes
disponíveis.
Se você digitar seta para baixo o virtual irá lendo os
componentes da lista. Se você já souber o componente
que deseja vá diretamente a ele digitando seu nome, por
exemplo: TButton, TEdit , TLabel, TPanel, TComboBox,
etc.
Ao Teclar ENTER o componente é inserido no centro do
Form.
Depois de teclar o ENTER o diálogo “Component List”
ainda não foi fechado e você pode inserir tantos
componentes quantos você selecionar.
Se permanecer no mesmo componente e for dando
“enter” este será adicionado no centro do form
consecutivamente, ou seja, se você estiver no tedit
serão colocados tedit1, tedit2, tedit3 etc, ou seja, tantos
tedit quantos “enter” forem dados.
Tomar cuidado com os componentes que podem
receber outros componentes em seu interior, tais como
TPanel e TGroupBox.
Para fechar o diálogo “Component List”, ou seja, sair da
lista de componentes, tecle ESC.
Propriedades de um Componente.
Para você chegar às propriedades de um componente a
partir do form no qual este esteja inserido, selecione o
componente desejado com o “tab” e, ao encontrá-lo,
tecle f11 que você chegará ao “Object Inspector”, ou
seja, na lista de propriedades de seu componente. Se
você não conhece as propriedades contidas na lista vá
com a seta para baixo ou para cima que serão lidas
todas as propriedades.
Caso você já conheça as propriedades de seu
componente e queira ir a uma específica tecle “tab” até
escutar “select on”. Estará aberto assim um campo para
você colocar o nome da propriedade que você queira ir
diretamente. Digamos que seja “caption”. Dependendo
de quantas propriedades existam começando com a
letra “c”, bastará você teclar “c” no “select on” para
chegar na “caption” e caso chegue em algo que não seja
a propriedade desejada, setas para baixo a encontrarão
rápidamente, já que você estará posicionado nas
propriedades começadas pela letra “c”.
Se você quiser trocar a característica da propriedade
escolhida vá teclando tab até escutar sua característica
atual. Vamos supor que esta seja “xxxxxx” e você queira
que seja “zzzzzz”. Depois de escutar “xxxxxx” tecle a
que você deseja e dê “enter”. A propriedade será
alterada. Para conferir tecle “tab” e escutará o “select
on” e, com outro “tab” a propriedade atual. Existem
propriedades que possuem caixas combinadas com
várias possibilidades de opções específicas: nesse caso
tecle “alt” e seta para baixo e você abrirá a caixa; depois
é só teclar seta para baixo para ir escutando as opções.
Ao encontrar a desejada tecle “enter” que esta estará
marcada para você.
Para voltar ao seu form tecle f12 até encontrar o título
de seu form. Ao encontrá-lo utilize o “tab” para encontrar
o próximo componente a ser trabalhado.
Obs: É bom que o amigo(a) sempre, antes de sair da
lista de propriedades (object inspector) para voltar ao
form, deixe a lista posicionada na propriedade “name”
para que no form você possa localizar com facilidade o
próximo componente a ser trabalhado.
Criar eventos para os componentes.
Em primeiro lugar, selecionar o componente que você
deseja através da tecla Tab no form. Ir para Object
Inspector (f11). Teclar “Control”+“TAB” para selecionar a
Orelha dos Eventos. O evento padrão do componente já
é selecionado automaticamente e será dito pelo VV . Se
você quiser outro evento que não seja o padrão tecle
“Tab” e digite o nome do evento que você deseja. Tecle
Tab novamente e estará no evento digitado, caso exista.
outra forma é simplesmente ir andando com a setinha
verticalmente (abaixo ou acima) e ir ouvindo os nomes
dos eventos da lista.
Para efetivamente codificar o evento tecle
Control+ENTER no evento selecionado e o Delphi já cria
um esqueleto de procedure para você entrar com o
código. A janela de edição é ativada e você já pode
digitar o código que deseja. Após inserir-lo lembre-se
sempre de teclar F11, Control+Tab e voltando assim
para a lista de propriedades (object Inspector) posicionar
novamente na propriedade “name” para que, voltando
para o form com f12 ter acesso fácil aos componentes
dando “tab”.
554 - Criação de DLLs
Esta é uma outra dúvida bastante freqüente que chega a nós. “Como posso
usar uma DLL ?”, “Como posso criar uma DLL ?”, “Ei, moço! Pra quê serve
uma DLL ?”
Pois bem, DLL ou Dynamic Link Libraries, permitem que um conjunto de
funções desenvolvidas em uma linguagem possam ser utilizadas em
programas desenvolvidos em outras linguagens.
Você pode, por exemplo, criar uma DLL em Delphi com um conjunto de
funções e utilizá-la em aplicativos desenvolvidos em C++ ou Visual Basic,
por exemplo. Agora, vamos começar criando uma DLL:
library Project1;
uses
SysUtils, Classes;
begin
end.
Em muitas situações, inclusive esta, o arquivo DELPHIMM.DLL deve ser
distribuído junto à sua aplicação. Uma outra observação muito importante,
para que você possa escrever suas DLLs, você deve ter conhecimentos na
Linguagem Object Pascal.
Vamos continuar criando nossa DLL, pois é ela que iremos usar mais para
frente. Apenas como exemplificação, vamos criar uma função que receba
como parâmetros dois números reais e retorne o maior deles.
Export = indica que a função poderá ser chamada por outros aplicativos.
Stdcall = permite que aplicativos desenvolvidos em outras linguagens
façam chamadas à função.
Após serem feitas estas alterações e salvar o projeto com o nome
MAXDLL, nossa DLL ficará assim:
library Project1;
uses
SysUtils,
Classes;
function Max(a, b :
double):double:expert:stdcall:
begin
if (a > b) then result:= a else result :=
b;
end;
exports
Max index 1;
begin
end.
unit usadll;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function Max(a, b :
double):double;stdcall;
var
Form1: TForm1;
implementation
{$R *.DFM}
function Max(a, b :
double):double;external ‘MaxDLL’;
procedure TForm1.Button1Click(Sender:
TObject);
var
x, y, resultado : double;
begin
x := StrToFloat(Edit1.Text);
y := StrToFloat(Edit2.Text);
resultado := Max(x,y);
ShowMessage(‘Valor Máximo ‘
+FloatToStr(resultado));
end;
end.
PS: A função Max está declarada na seção interface e implementada na
seção implementation, ou seja, a função está implementada em uma DLL.
Bem, mostramos como criar uma DLL simples e como fazer chamada de
uma DLL. Agora, iremos melhorar nossa DLL, fazendo com que ela exiba
um formulário qualquer em qualquer aplicação desenvolvida para Windows.
Equipe GDI: Alexandre Andrade e Wagner Santos Todos os direitos
reservados 2000
Copyright © 2000 GDI - All rights reserved
555 - Criando um componente Skin
Aqui iremos tratar da criação de um componente SKIN
como os do WINAMP. Para montar os SKINS devemos
utilizar um Bitmap e deixar as bordas do formulários
transparentes (ocultas).
A solução é bem simples, utilizando o componente
Timage, dê uma olhado no fonte:
unit SkinImage;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics,
Controls, Forms, Dialogs,
ExtCtrls;
type
TSkinImage = class(TImage)
private
protected
{ Protected declarations }
function BitmapToRegion(bmp: TBitmap) :
dword;
procedure OwnerShow(Sender : TObject);
public
constructor Create(AOwner : TComponent);
override;
published
{ Published declarations }
end;
procedure Register;
var
Ready : Boolean;
implementation
procedure Register;
begin
RegisterComponents(‘CLINICA DELPHI’,
[TSkinImage]);
end;
{ TSkinImage }
constructor TSkinImage.Create(AOwner:
TComponent);
begin
inherited Create(AOwner);
if NOT (csDesigning in ComponentState)
then
with TForm(AOwner) do
begin
BorderStyle := bsNone;
Self.Top := 0;
Self.Left := 0;
OnShow := OwnerShow;
end;
end;
function TSkinImage.BitmapToRegion(bmp:
TBitmap) : dword;
var ix,iy : integer; // loop nas variáveis
tc : TColor; // transparentColor
b1 : boolean; // está olhando o “real”
pixels (no transparent pixels)
c1 : cardinal; // ajusta a variável na
região
i1 : integer; // primeira posição real
em pixel
begin
Result := 0;
i1 := 0;
// memória do transparent color
tc := bmp.transparentColor and $FFFFFF;
with bmp.canvas do
// enquadrilhe por todas as linhas
for iy := 0 to bmp.height - 1 do
begin
b1 := False;
// esquadrinhe por todo o pixels nesta
linha
for ix:=0 to bmp.Width - 1 do
// feito nós acharmos o começo/final
seguidos em pixel
if (pixels[ix, iy] and $FFFFFF <> tc) <>
b1 then begin
// sim, e foi o último pixel,
// so nós podemos somar uma região de
estilo de linha…
if b1 then begin
c1:=CreateRectRgn(i1,iy,ix,iy+1);
if result<>0 then
begin
// Esta não é a primeira região
CombineRgn(Result, Result, c1, RGN_OR);
DeleteObject(c1);
// Esta é a primeira região
end
else
Result := c1;
end else i1 := ix;
// mude o modo e procura o primeiro ou
último pixel?
b1:=not b1;
end;
// o último pixel nesta fila era um
pixel real?
if b1 then begin
c1:=CreateRectRgn(i1, iy, bmp.width-1,
iy+1);
if (Result <> 0) then
begin
CombineRgn(Result, Result, c1, RGN_OR);
DeleteObject(c1);
end
else
Result := c1;
end;
end;
end;
procedure TSkinImage.OwnerShow(Sender:
TObject);
var
Region : HRGN;
begin
if NOT Ready then
begin
Ready := True;
Region :=
BitmapToRegion(Picture.Bitmap);
SetWindowRgn(TForm(Owner).Handle,
Region, True);
DeleteObject(Region);
end;
end;
initialization
Ready := False;
end.
TBlobField(FieldByName(‘SOM’)).SaveToFile(
‘MyWaveCopy.wav’);
A maneira mais simples de utilizar o conteúdo de um
campo BLOB já armazenado é primeiro gravá-lo
novamente em um arquivo em disco, usando o método
SaveToFile, e depois manipulá-lo normalmente. No caso
de um conteúdo em formato wave, por exemplo, você
deve primeiro gravá-lo num arquivo .wav, e então
reproduzí-lo através do TMediaPlayer ou pela função
SndPlaySound.
Usando os mesmos métodos, você também pode
armazenar e manipular filmes AVI, apresentações,
documentos, enfim, o que a sua imaginação mandar.
Mas tenha em mente que o armazenamento de arquivos
de som ou outros tipos vai aumentar consideravelmente
o tamanho do seu banco de dados, por isso esse
recurso deve ser utilizado com cuidado. Uma boa
medida para reduzir esse problema é compactar o
arquivo antes de armazená-lo. Para utilizá-lo depois,
basta gerar o arquivo novamente em disco e
descompactá-lo. Para saber quanto um campo BLOB
está ocupando num registro do seu arquivo, em bytes,
use a propriedade BlobSize:
TBlobField(MyTable.FieldByName(‘SOM’)).Blo
bSize;
Obs: Para armazenar imagens ou texto em formato
RichText (RTF), use os tipos GRAPHIC e FORMATED
MEMO do Paradox, que são destinados a esses tipos de
dados. O Delphi também possui objetos para a
manipulação desses campos: TGraphicField e
TMemoField, ambos descendentes do TBlobField.
557 - Usuario logado
function LogUser : String;
{Requer a unit Registry declarada na
clausula Uses da Unit}
var
Registro:TRegistry;
begin
Registro := TRegistry.Create;
Registro.RootKey := HKEY_LOCAL_MACHINE;
if Registro.OpenKey(‘Network\Logon’,
false) then
begin
result := Registro.ReadString(‘username’);
end;
Registro.Free;
end;
559 - Executando sons no PC-
Speaker
PlaySong(‘CCEC’); Onde: C = DO D = RE E = MI F = FA
G = SOL A = LA B = SI
unit MUSIC;
Interface
Implementation
procedure TForm1.AtualizaPrn;
begin
StaticText1.Caption := ImpressoraCorrente;
end;
procedure TForm1.MostraTamPapel;
var
ADevice, ADriver, APort: array[0..255] of
char;
DeviceMode: THandle;
M: PDevMode;
s: string;
begin
// Força o uso de Printer. Se esta linha
for removida, a primeira
// invocação falha. Bug da VCL
S :=
Printer.Printers[Printer.PrinterIndex];
// Pega dados da impressora atual
Printer.GetPrinter(ADevice, ADriver,
APort, DeviceMode);
// Pega um ponteiro para DEVMODE
M := GlobalLock(DeviceMode);
if M <> nil then
MostraDevMode(M^);
end;
function
TForm1.PegaTamanhoPapel(dmPaperSize:
word): string;
begin
Result := ‘Desconhecido’;
// Verifica ALGUNS TAMANHOS POSSÍVEIS.
Existem outros, veja DEVMODE
case dmPaperSize of
DMPAPER_USER: Result := ‘Definido pelo
usuário’;
DMPAPER_LETTER: Result := ‘Letter, 8 1/2-
by 11-inches’;
DMPAPER_LEGAL: Result := ‘Legal, 8 1/2- by
14-inches’;
DMPAPER_A4: Result := ‘A4 Sheet, 210- by
297-millimeters’;
end;
end;
procedure TForm1.MostraDevMode(const M:
TDevMode);
begin
// Mostra o valor de alguns campos
with M do
begin
// Mostra nome da impressora
Memo1.Lines.Add(‘Nome:’ + dmDeviceName);
// Verifica se campo tamanho do papel esta
preenchido e mostra
if dmFields and DM_PAPERSIZE <> 0 then
Memo1.Lines.Add(PegaTamanhoPapel(dmPaperSi
ze));
if dmFields and DM_PAPERLENGTH <> 0 then
Memo1.Lines.Add(Format(‘Altura:%d’,
[dmPaperLength]));
if dmFields and DM_PAPERWIDTH <> 0 then
Memo1.Lines.Add(Format(‘Comprimento:%d’,
[dmPaperWidth]));
end;
end;
procedure TForm1.Button2Click(Sender:
TObject);
var
P: TPrinterSetupDialog;
begin
P := TPrinterSetupDialog.Create(self);
try
P.Execute;
finally
P.Free;
end;
AtualizaPrn;
end;
procedure TForm1.Button4Click(Sender:
TObject);
begin
MudaTamPapel(DMPAPER_LETTER, 0, 0);
MostraTamPapel;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
MudaTamPapel(DMPAPER_USER,
StrToInt(EdComp.Text),
StrToInt(EdAlt.Text));
end;
procedure TForm1.Button3Click(Sender:
TObject);
begin
Printer.Title := ‘Teste de filha’;
Printer.BeginDoc;
Printer.EndDoc;
end;
procedure TForm1.Button5Click(Sender:
TObject);
begin
MostraTamPapel;
end;
procedure TForm1.FormShow(Sender:
TObject);
begin
AtualizaPrn;
end;
Equipe GDI: Alexandre Andrade e Wagner Santos Todos os direitos
reservados 2000
Copyright © 2000 GDI - All rights reserved
561 - Testa se determinada tecla
está pressionada
function GetToggleState(Key: integer):
boolean;
begin
Result := Odd(GetKeyState(Key));
end;
end;
562 - Como evitar efeito de
maximização
Se você já desenvolveu uma aplicação MDI com um
formulário MDIChild que tem que ser exibido em estado
Maximizado (WindowState=wsMaximized),
provavelmente você já se deparou com aquele
deselegante problema em que o usuário acompanha a
maximização do seu formulário. Para evitar isto, faça o
seguinte:
Antes de criar o seu formulário para a exibição, utilize
LockWindowUpdate(Handle);
Após a criação do formulário, utilize
LockWindowUpdate(0);
Com isto, você dará um efeito mais profissional às suas
aplicações.
Exemplo:
procedure MainForm.ItemArqCadFor(Sender:
TObject);
begin
LockWindowUpdate(Handle);
with TFrmCadFor.Create(self) do Show;
LockWindowUpdate(0);
end;
563 - Como usar as teclas de
função F1, F2, etc?
- Para você colocar chamadas usando as teclas de
função basta colocar o seguinte código no evento
‘OnKeyDown’ do formulário:
procedure
Tform1.FormKeyDown(Sender:TObject; var
Key: Word; Shift: TShifState);
begin
if key = vk_F1 then begin
{ instrucoes a serem executadas }
end;
end;
- OBSERVAÇÃO:
Não se esqueça de colocar a propriedade ‘KeyPreview’
do formulário em ‘True’.
Você também pode usar as variáveis VK_F1 até
VK_F12 referentes as outras teclas de função.
564 - Rotina genérica para
tratamento de erros na aplicação -
BDE
Procedure TrataErro(vErro :
EDBEngineError);
Var
x : Integer;
Begin
For x := 0 To vErro.ErrorCount -1 Do
Begin
If vErro.Errors[x].NativeError=0 Then
Case vErro.Errors[x].ErrorCode Of
9475:Erro(‘Espaço Insuficiente em
Disco.’);
9479:Erro(‘Tabela Está Cheia’);
9429:Erro(‘Espaço Insuficiente em
Disco.’);
9432:Erro(‘Campo Obrigatório Sem
Valor.’);
…
10241:Erro(‘Registro em Uso Por Outro
Usuário.’);
Else
Erro(‘Comunique o Erro Abaixo ao
Departamento de Informática.’+#13+
IntToStr(vErro.Errors[x].ErroCode+’-‘+vErr
o.Errors[x].Message);
End;
End;
End;
–- MAIS –
ou
Procedure MostraErro;
Begin
ShowMessage(‘Ocorreu algum erro!’);
end;
TForm1.Create;
Begin
Application.OnException:=MostraErro;
end;
565 - Como usar o Install Shield
Supondo que você fez um sistema, que está no diretório
C:\Contas, deixe apenas o Arquivo executável .exe e as
suas tabela .db (para Arquivoc Paradox) e os arquivos
de índice que são de extensão *.PX e *.XG0. Se você
possui imagens coloque as também.
Supondo ainda que você queira instalar o seu programa
no diretório C:\ContasNew.
1) Na primeira tela, escolha a opção Create a new Setup
Project
2) Na segunta tela (New Project), na caixa Project Name
escreva o nome que quer dar em seu Projeto (Ex.
ContasNew)
3) Clique em Create
4)Na lista que irá aparecer clique no 1º botão
(Application Informatio)
5)Clique no botão Browse, e escolha o executável, no
meu caso será o Contas.exe que está dentro do diretório
C:\Contas
6)Na opção Defalt Destination Directory deixe apenas
C:\ContasNew, se quizer que seja instalado dentro do
diretório Arquivos de Programa deixe como ao lado
\ContasNew
7)Clique em OK
8)Clique na opção General Options, clique no DBE
(Borland DataBase Engine)
9)Irá aparecer uma segunda tela, clique em avançar.
10) Se no seu programa você utiliza um alias para se
referenciar as suas tabelas, clique em New você terá
que digitar o nome
do seu Alias e depois clique em OK
11) Clique em Avançar, escolha (marque a opção) Save
.CFG file for…….
12) Clique em Avançar. No campo Path digite o caminho
de suas tabelas (C:\ContasNew)
13) No campo Type, escolha o tipo de Tabela que você
usou (Paradox)
14) Clique em avançar, depois em Concluir e depois em
OK.
15) Clique no botão Groups and Files.
16) Clique sobre a pasta Program Files.
17) Clique em Launch Explorer, irá aparecer o Explorer
do windows. Entre no diretório que estão os seus
arquivos *.exe, *.db, *.PX e etc)
18) Selecione todos os Arquivos (Tecla Shift
pressionada)
19) Após selecionados os arquivos, arraste-os para a
barra de tarefas, em cima do Icone do InstallShield, ele
será maximizado e você colocará os arquivos no espaço
em branco do File Groups .
20) Clique em OK (neste monento, o DBE e todos os
seus arquivos já estão configurados).
21) Clique no botão Dialog Boxes. Iremos montar as
telas que irão fazer a interface com o usuário na hora da
instalação.
22) Selecione apenas a opção Welcome Message (2º),
Select Program Folder e a opção Setup Complete
(Última opção)
23) Clique em OK.
24) No final da página clique em Click Here for page 2
25) Clique no botão de Disk Builder
26) Escolha o tamanho dos disquetes Disk Syze (1.44),
depois clique em Build
27) Depois de pronto o disco, clique em Close. (Criamos
no mínimo 3 discos, pois o DBE ocupa 3 discos e mais o
nosso programa).
28) Se você quiser testar se a instalação está correta,
clique em Test Run.
29) Para copiar os discos de instalação, clique em Copy
to Floppy.
30) Selecione o disco que você quer copiar ou selecione
todos os discos em Copy All Disk ….. E selecione para
que drive será copiado os discos de instalação.
31) Pronto. Os seus discos de instalação já estão
copiados.
566 - Como limpar o conteudo de
um LookupComboBox
DBLookupComboBox1.KeyValue:=’ ‘;
567 - Como fazer para o sistema
nao pedir o Login (Password) Banco
de Dados
Coloque um componente TDatabase, a propriedade
LoginPrompt como
false e daí os parâmetros de nome de usuário e senha
na propriedades dos parâmetros…
568 - Dicas QuickReport
O objetivo deste exercício é fazer um relatório que
apresente uma relação um para muitos entre duas
tabelas. Por
exemplo:
A tabela 1 (MasterTable) possui a descrição de todos os
clientes da empresa e a tabela 2 (DetailTable) possui os
dados de todas as compras realizadas por cada cliente.
Temos neste caso uma relação 1:N. O objetivo deste
exemplo é produzir um relatório com o formato abaixo
descrito:
MasterTable.filter:=‘Id=’+InttoStr(id_serv
);
MasterTable.filtered:=true;
QRLabel18.Caption:=Form23.Edit2.text;
QRLabel18.Left:=doseaciForm.width div 2-
QRLabel18.width div 2;
try
QRMemo1.Lines.LoadFromFile(‘prelat.txt’);
QRImage1.Picture.loadfromfile(simbolo);
finally
end;
end;
6.Para ativar o formulário a um evento OnClick, coloca-
se a seguinte codificação:
QRMDForm.Preview;
570 - Função de potenciação -
Juros
Segue abaixo uma função para efetuar a potenciação. É
útil para compor formulas financeiras, como a de VP
(“PV” valor presente) VF (“FV” valor futuro)
Exemplo:
Calcular o valor de um produto para o prazo de 30 dias
com a taxa de juros de 5% mês.
var
i: Real; // taxa de juros
valor: Real; // valor base para calculo
do valor futuro.
pz: Integer // prazo em dias
begin
i := 5//100;
valor:= 1000.00
pz := 30
Result:= valor*( Pot( (1+i), (pz/30) )
//Resultado 1.050,00
end;
no excel a Pot é substituída pelo sinal ^ Ex. =E18*
((1+C19)^(C20/30))
Function Pot( base, expoente: real ):real;
// Potenciação
begin
{ utiliza a função de exponencial e de
logaritmo }
Result:= Exp((expoente * Ln( base )));
end;
Dicas:
Não amplie o nome da função, pois as funções
financeiras costumam ser bem extensas.
571 - Lista de erros BDE
System Related (Fatal Error)
8449 : $2101 : Cannot open a system
file.
8450 : $2102 : I/O error on a system
file.
8451 : $2103 : Data structure
corruption.
8452 : $2104 : Cannot find Engine
configuration file.
8453 : $2105 : Cannot write to Engine
configuration file.
8454 : $2106 : Cannot initialize with
different configuration file.
8455 : $2107 : System has been illegally
re-entered.
8456 : $2108 : Cannot locate IDAPI32
.DLL.
8457 : $2109 : Cannot load IDAPI32 .DLL.
8458 : $210A : Cannot load an IDAPI
service library.
8459 : $210B : Cannot create or open
temporary file.
8460 : $210C : Trying to load multiple
IDAPIxx.DLL
8461 : $210D : Shared Memory Conflict
Object of Interest not Found
interface
const
// geral
appRegisterValue = 99.00;
// Fluxo de caixa
rgFluxoDataLimite = ‘Data limite’;
rgFluxoSaldoCaixa = ‘Saldo em caixa’;
// contas orçamentárias
tvSep = ‘ - ‘;
// diretório de figuras para os gráficos
(logomarca, etc…)
chtPicturePath = ‘Imagens dos gráficos’;
resourcestring
// strings de recurso
// geral
// string simples
SFechandoFilhas = ‘Fechando janelas
filhas abertas da aplicação…’;
// string com parâmetro
SInsercaoInvalida = ‘Não será possível
adicionar mais registros de %s.’;
// acesso
SInterfaceInserir = ‘Adicionar novos
registros de %s’;
SInterfaceEditar = ‘Alterar registros de
%s cadastrados’;
SInterfaceApagar = ‘Apagar registros de
%s cadastrados’;
implementation
end.
Como utilizar as strings de recurso
Quando você desejar utilizar strings de recurso simples,
simplesmente adicione-as onde for necessário.
raise
EDatabaseError.Create(SFechandoFilhas);
ShowMessage(SFechandoFilhas);
Quando desejar utilizar strings de recurso com
parâmetros, utilize a função Format fornecendo como
parâmetros, os valores que você deseja exibir na forma
de array de argumentos.
raise
EDatabaseError.CreateFmt(SInsercaoInvalida
, [‘clientes’]);
>> saída >> ‘Não será possível adicionar mais registros
de clientes’
// observação: aqui não há a necessidade de utilizar a
função Format porque o método
// CreateFmt já requer dois parâmetros para a criação
de uma exceção.
ShowMessage(Format(SInsercaoInvalida,
[‘clientes’]));
>> saída >> ‘Não será possível adicionar mais registros
de clientes’
Para saber mais sobre a formatação de strings, procure
no help do Delphi por Format strings.
574 - Como inserir um registro com
o componente UpDateSQL
Na propriedade InsertSQL informe com a seguinte
sintaxe:
INSERT INTO “:Senior:E085CLI” (CodCli,
NomCli)
VALUES ( 1, ‘Jerônimo’ )
575 - Como saber qual o objeto que
esta com o foco no form
Através do evento onKeyPress do form, pode-se testar:
if (ActiveControl is TCustomEdit) and (Key
= #1) then
blablabla;
ou Como no exemplo abaixo:
procedure TForm1.mnuPasteClick(Sender:
TObject);
var
CanPaste: Boolean;
Ctrl: TWinControl;
begin
Ctrl := ActiveControl;
if (Assigned(Ctrl) and
Clipboard.HasFormat(CF_TEXT)) then
begin
if (Ctrl is TEdit) then
CanPaste := (not TEdit(Ctrl).ReadOnly)
else if (Ctrl is TMaskEdit) then
CanPaste := (not
TMaskEdit(Ctrl).ReadOnly)
else if (Ctrl is TMemo) then
CanPaste := (not TMemo(Ctrl).ReadOnly)
else if (Ctrl is TRichEdit) then
CanPaste := (not
TRichEdit(Ctrl).ReadOnly)
else
CanPaste := False;
if (CanPaste) then
TCustomEdit(Ctrl).PasteFromClipboard;
end;
end;
576 - Como utilizar o form Sobre
padrão do Windows
O Windows, como todos sabem, possui uma gama de
ferramentas embutidas em sua API (Application
Program Interface). Uma delas é o formulário “Sobre…”
(About…) que pode ser utilizado por quem desejar. Para
fazer uso deste formulário é muito simples:
1 - Adicione à cláusula uses da seção Interface do
formulário desejado, a unit ShellAPI.
2 - Agora, na procedure que exibe o formulário sobre,
escreva a seguinte linha:
ShellAbout(Handle, ‘Aplicativo’, ‘Autor’,
Application.Icon.Handle);
onde:
Handle -> é o manipulador do formulário que chama a
rotina da API. Utilize 0 (zero) se desejar.
Aplicativo -> é o nome do seu aplicativo. Utilize, para
facilitar, a variável Application.Title.
Autor -> é o nome do autor do aplicativo.
Application.Icon.Handle -> é o manipulador do ícone
pelo qual o seu aplicativo é representado.
Para maiores detalhes, leia sobre a função “ShellAbout”
no help on-line do Delphi.
577 - Como evitar as mensagens de
Warning do Compilador (Variavel não
inicializada)
{$WARNINGS OFF}
function TfrmEdit.ProjectTypeToUse(const
cPath: string): Integer; var
SR: TSearchRec;
begin
if not DirectoryExists(cPath) then begin
ErrMsg(‘Path não localizado!’);
Exit;
end;
try
if FindFirst(cPath +
‘\*.VBP’,faDirectory,SR) = 0 then
Result := VBP_FILTER
else
Result := DPR_FILTER;
except
ErrMsg(‘Falha de sistema -‘ + cPath);
Result := 1
end;
end;
{$WARNINGS ON}
578 - Como diminuir o tempo de
abertura do Table e Query
Operação feita quando é executado o método Open do
componente TTable ou TQuery, que produz a
compilação e execução do comando select. Quando
esse método é executado através do componente
TTable, o Delphi realiza uma série de outros comandos
SQLs para buscar informações do catálogo da tabela
necessárias para as operações de seleção e
atualização. Essa busca pode ser otimizada através da
opção ENABLE SCHEMA CACHE do BDE, fazendo
com que essas informações sejam lidas apenas uma
vez durante a execução da aplicação. Quando o
primeiro acesso é feito, o BDE armazena as
informações em um arquivo e qualquer nova
necessidade de abertura da mesma tabela não
necessita buscar novamente os elementos do catálogo.
Por outro lado, utilizando-se o componente TQuery,
pode-se desviar dessa busca desde que não se utilize a
propriedade Request Live que torna o “result set” da
“query” atualizável automaticamente pelo Delphi. Se o
valor da propriedade Request Live for TRUE e o
SELECT utilizado obedecer as restrições para que o
Delphi consiga atualizar o “result set”, as mesmas
buscas utilizadas para o componente TTable terão que
ser feitas.
Concluindo, para que a busca de elementos do catálogo
não seja feita é necessário utilizar o componente
TQuery e controlar as atualizações manualmente ou
através de componentes do tipo TUpdateSQL.
579 - Caixas de mensagens da
aplicação
procedure
TfrmProduto.DSMainUpdateData(Sender:
TObject);
var ret: integer;
begin
If OperState in [opNone,opNewForInsert]
then begin
ret:=Application.MessageBox(‘Deseja
salvar as alterações’,
‘Confirmação’, MB_YESNOCANCEL +
MB_ICONQUESTION );
case ret of
idYes: Save;
idNo: Discard;
idCancel: Abort;
end;
end;
end;
580 - Retorna que tipo de variavel
é
function GetVariantType(const v: variant):
string;
begin
case TVarData(v).vType of
varEmpty: result := ‘Empty’;
varNull: result := ‘Null’;
varSmallInt: result := ‘SmallInt’;
varInteger: result := ‘Integer’;
varSingle: result := ‘Single’;
varDouble: result := ‘Double’;
varCurrency: result := ‘Currency’;
varDate: result := ‘Date’;
varOleStr: result := ‘OleStr’;
varDispatch: result := ‘Dispatch’;
varError: result := ‘Error’;
varBoolean: result := ‘Boolean’;
varVariant: result := ‘Variant’;
varUnknown: result := ‘Unknown’;
varByte: result := ‘Byte’;
varString: result := ‘String’;
varTypeMask: result := ‘TypeMask’;
varArray: result := ‘Array’;
varByRef: result := ‘ByRef’;
end;
end;
581 - Retorna o último acesso de
um arquivo
function GetFileLastAccessTime(sFileName :
string ) : TDateTime;
var
ffd : TWin32FindData;
dft : DWord;
lft : TFileTime;
h : THandle;
begin
// get file information
h :=
Windows.FindFirstFile(PChar(sFileName),
ffd);
if(INVALID_HANDLE_VALUE <> h)then
begin
Windows.FindClose( h );
FileTimeToLocalFileTime(ffd.ftLastAccessTi
me, lft );
FileTimeToDosDateTime(lft,LongRec(dft).Hi,
LongRec(dft).Lo);
Result := FileDateToDateTime(dft);
end;
end;
582 - Retorna a versão do
aplicativo
function GetBuildInfo:string;
var
VerInfoSize: DWORD;
VerInfo: Pointer;
VerValueSize: DWORD;
VerValue: PVSFixedFileInfo;
Dummy: DWORD;
V1, V2, V3, V4: Word;
Prog : string;
begin
Prog := Application.Exename;
VerInfoSize :=
GetFileVersionInfoSize(PChar(prog),
Dummy);
GetMem(VerInfo, VerInfoSize);
GetFileVersionInfo(PChar(prog), 0,
VerInfoSize, VerInfo);
VerQueryValue(VerInfo, ‘',
Pointer(VerValue), VerValueSize);
with VerValue^ do
begin
V1 := dwFileVersionMS shr 16;
V2 := dwFileVersionMS and $FFFF;
V3 := dwFileVersionLS shr 16;
V4 := dwFileVersionLS and $FFFF;
end;
FreeMem(VerInfo, VerInfoSize);
result := Copy (IntToStr (100 + v1), 3, 2)
+ ‘.’ +
Copy (IntToStr (100 + v2), 3, 2) + ‘.’ +
Copy (IntToStr (100 + v3), 3, 2) + ‘.’ +
Copy (IntToStr (100 + v4), 3, 2);
end;
583 - Converte um arquivo JPEG em
BMP
function JpgToBmp(cImage: String):
Boolean;
// Requer a Jpeg declarada na clausua uses
da unit
var
MyJPEG : TJPEGImage;
MyBMP : TBitmap;
begin
Result := False;
if fileExists(cImage+’.Jpeg’) then
begin
MyJPEG := TJPEGImage.Create;
with MyJPEG do
begin
try
LoadFromFile(cImage+’.Jpeg’);
MyBMP := TBitmap.Create;
with MyBMP do
begin
Width := MyJPEG.Width;
Height := MyJPEG.Height;
Canvas.Draw(0,0,MyJPEG);
SaveToFile(cImage+’.Bmp’);
Free;
Result := True;
end;
finally
Free;
end;
end;
end;
end;
584 - Retorna a idade atual de uma
pessoa
function IdadeAtual(Nasc : TDate):
Integer;
Var AuxIdade, Meses : String;
MesesFloat : Real;
IdadeInc, IdadeReal : Integer;
begin
AuxIdade := Format(‘%0.2f’, [(Date -
Nasc) / 365.6]);
Meses :=
FloatToStr(Frac(StrToFloat(AuxIdade)));
if AuxIdade = ‘0’ then
begin
Result := 0;
Exit;
end;
if Meses[1] = ‘-‘ then
begin
Meses := FloatToStr(StrToFloat(Meses) *
-1);
end;
Delete(Meses, 1, 2);
if Length(Meses) = 1 then
begin
Meses := Meses + ‘0’;
end;
if (Meses <> ‘0’) And (Meses <> ”) then
begin
MesesFloat := Round(((365.6 *
StrToInt(Meses)) / 100) / 30.47)
end
else
begin
MesesFloat := 0;
end;
if MesesFloat <> 12 then
begin
IdadeReal :=
Trunc(StrToFloat(AuxIdade)); // +
MesesFloat;
end
else
begin
IdadeInc := Trunc(StrToFloat(AuxIdade));
Inc(IdadeInc);
IdadeReal := IdadeInc;
end;
Result := IdadeReal;
end;
585 - Transferência de som em um
CHAT
Utilizando Clientsocket e ServerSocket chame o
método
ClientSocket.socket.sendStream(SuaVozEmStream).
Ou utilizar os componentes TNMStrm e NMStrmServ
que são específicos para o envio de Streams.
Existe um exemplo em Delphi5\Demos\FastNet\Strm
que demonstra como transferir images usando esse
componente, mas é fácil trocar a imagem por voz.
586 - Como alterar o driver de
acesso do access no bde
automaticamente
Eu fiz um procedimentozinho que funciona:
procedure ChangeAccessDLL32(Dll : String);
// Altera a Propriedade do
BDE\Drivers\Native\MSACCESS\Dll32
var
Reg : TRegistry;
begin
Reg := TRegistry.Create;
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if
Reg.OpenKey(‘\Software\Borland\DataBase
Engine\Settings\Drivers\MSACCESS\INIT’,
True)
then Reg.WriteString(‘DLL32’,Dll);
finally
Reg.CloseKey;
Reg.Free;
end;
end;
begin
{POSICIONA O PONTEIRO DA TABELA DE
CLIENTES,
EM RELAÇÃO À TABELA DE PEDIDOS}
DmDados.tbClientes.FindKey([DMDADOS.Tbpedi
dosped_Cliente.Value]);
{Relaciona a variável impressora com a
lpt1: - Poderia ser LPT, COM1,//
Servidor/impressora}
AssignFile(IMPRESSORA,‘LPT1:’);
{abre a porta da impressão }
Rewrite(IMPRESSORA);
{envia caractere de controle para
comprimir a impressão}
Write(IMPRESSORA);
{ Imprime o caractere “x” (marcando Nota
de Saída) e salta para próxima linha}
Writeln(Impressora,Format(‘%80s’,
[‘x’]));
{ salta duas linhas}
Writeln(impressora);
Writeln(Impressora);
{ Imprime a string “Vendas”, alinhado à
esquerda”-” dentro de uma área de quarenta
caracteres}
Write(Impressora,Format(‘%-40s’,
[‘Vendas’]));
{ Imprime a string “5.12”, e salta para
próxima linha}
WriteLn(Impressora,Format(‘%10s’,
[‘5.12’]));
{ Salta duas linhas}
Writeln(impressora);
Writeln(Impressora);
{ –- Impressão dos Dados do Consumidor–
—}
{ Imprime a Razão Social, alinhado à
esquerda dentro de uma área de 90
caracteres}
Write (Impressora,Format(‘%-90s’, [
dmdados.tbClientesCli_Razao.Value]));
{ Imprime a CGC, alinhado à esquerda
dentro de umaárea de 30 caracteres}
Write(Impressora,Format(‘%-30s’,
[dmdados.tbClientesCli_CGC.Value]));
{ Imprime a Data de Emissão, baseada na
data atual e salta para próxima linha}
Writeln(Impressora,DatetoStr(Date));
{ Salta uma linha}
Writeln(Impressora);
{ Imprime Endereço,alinhado à
esquerda”-” dentro de uma área de 70
carcateres}
Write(Impressora,Format(‘%-70s’,
[dmdados.tbClientesCli_Endereco.Value]));
{Imprime Bairro, dentro de uma área de
35 carcateres}
Write(Impressora,Format(‘%-35s’,
[dmdados.tbClientesCli_Bairro.Value]));
{ Imprime CEP, dentro de uma área de 15
carcateres}
Write(Impressora,Format(‘%-15s’,
[dmdados.tbClientesCli_CEP.Value]));
{Imprime a Data de Saída, baseada na
Hora Atual e Salta para próxima Linha}
Writeln(Impressora,DatetoStr(Date));
{ Salta uma linha}
Writeln(Impressora);
{ Imprime Munícipio, dentro de uma área
de 60 caracteres}
Write(Impressora, Format(‘%-60s’,
[dmdados.tbClientesCli_Cidade.Value]));
{ Imprime DD+Telefone, dentro de uma
área de 30 caracteres}
Write(Impressora,Format(‘%-30s’,
[dmdados.tbClientesCli_DDD.Value+’ ‘+
dmdados.tbClientesCli_Fone1.Value]));
{ Imprime Estado (UF), dentro de uma
área de 5 caracteres}
Write(Impressora,Format(‘%-5s’,
[dmdados.tbClientesCli_Estado.Value]));
{ Imprime Inscrição Estadual, dentro de
uma área de 25 caracteres}
Write(Impressora,Format(‘%-25s’,
[dmdados.tbClientesCli_Inscricao.value]));
{ Imprime a Hora de Saída, baseada na
Hora Atual e Salta para próxima Linha}
Writeln(Impressora,TimetoStr(time));
{ Salta três linhas}
Writeln(Impressora);
Writeln(Impressora);
Writeln(Impressora);
{–— Fase de Emissão dos Itens da Nota –
—}
{ Zero variáveis}
Valorbase:=0;
valoricms:=0;
{ Move o ponteiro de registro da tabela
de Itens para o primeiro}
Dmdados.TbItens.First;
{ Início do Laço}
While not (Dmdados.tbItens.Eof) do
Begin
{ Imprime Código produto}
Write(Impressora,Format(‘%-15s’,
[InttoStr(Dmdados.tbItensIT_Produto.Value)
]));
{ Imprime Descrição do produto}
Write(Impressora,Format(‘%-68s’,
[dmdados.TbitensProdutos.value]));
{ Imprime Quantidade Comercializada}
Write(Impressora,Format(‘%12.2n’,
[Dmdados.tbItensIt_Quantidade.value]));
{ Imprime Preço Unitário produto}
Write(Impressora,Format(‘%15.2m’,
[dmdados.tbitensit_valor.value]));
{ Imprime o valor Total do Item e salta
uma linha}
Writeln(Impressora,Format(‘&15.2f’,
[dmdados.tbItensValorItem.Value]));
{ Soma o valor Base de Cálculo do ICMS}
Valorbase:=ValorBase +
dmdados.tbItensValorItem.Value;
{ Próximo Item}
Dmdados.Tbitens.next;
end;
{ laço de Itens}
{ Salta o núemro de linhas necessárias
para completar o espaço restante de itens}
For Contador:= 1 to (20-
dmdados.tbItens.recordCount)do
Writeln(Impressora);
{ Salta duas Linhas}
Writeln(Impressora);
Writeln(Impressora);
{ Imprime o valor total dos produtos e
salta uma linha}
Writeln(Impressora,Format(‘%120.2f’,
[ValorBase]));
{ Salta duas linhas}
Writeln(Impressora);
Writeln(Impressora);
{ Cálculo do Imposto - baseada na
Alíquota de 12%}
valoricms:=(Valorbase*0.12);
{ Imprime Valor base}
Write(Impressora,Format(‘%30.2f’,
[Valorbase]));
{ Imprime Valor ICMS e salta ‘p/ próxima
linha}
Write(Impressora, Format(‘%30.2f’,[
ValorICMS]));
{ Salta uma linha}
Writeln(Impressora);
{ Imprime o valor total da Nota e salta
uma linha}
Writeln(Impressora,Format(‘%120.2f’,
[Valorbase]));
{ Salta duas linhas}
Writeln(Impressora);
Writeln(Impressora);
{ Imprime informações transportador}
Writeln(Impressora,Format(‘%-30s’, [‘o
mesmo’]));
{ salta tr6es Linhas}
Writeln(Impressora);
Writeln(Impressora);
Writeln(Impressora);
{ Fecha a porta de impressão}
System.Close(Impressora);
end; { final da procedure}
BOLETA BANCARIA
procedure TFmGerRec.BtBoletaClick(Sender:
TObject);
Var
Impressora:TextFile;
begin
AssignFile(Impressora,‘LPT1:’);
Rewrite(Impressora);
Writeln(impressora);
//Imprime Local de pagamento
Write(impressora,Format(‘%-50s’,[‘
(PAGAVEL EM QUALQUER BANCO ATE O
VENCIMENTO)’]));
//Imprime Data Vencto e pula para próxima
linha
Writeln (impressora,Format(‘%-20s’,
[”+DatetoStr(DmDados.TbcontasRecRec_DataVe
ncto.Value)]));
//pula três linhas
Writeln(Impressora);
Writeln(impressora);
Writeln(impressora);
Writeln(impressora,Format(‘%-50s’,
[”+DatetoStr(DmDados.TbcontasRecRec_DataEm
issao.Value)]));
Writeln(impressora,Format(‘%-52s’,
[”+InttoStr(DmDados.TbcontasRecRec_Numero.
Value)]));
Writeln(impressora);
//Imprime valor do Documento e pula p/
Próxima linha
Write(impressora, Format(‘%-55s’,[ ‘
‘]));
Writeln(impressora, Format(‘%-8.2m’,
[DmDados.TbContasRecRec_Valor.Value]));
Writeln(impressora, Format(‘%-50s’,[‘
Neste Espaco Voce pode imprimir o
Texto’]));
Writeln(impressora, Format(‘%-50s’,[‘ De
Responsabilidade do Cedente, comum em
‘]));
Writeln(impressora, Format(‘%-50s’,[‘
Diversos Bancos,Ex: ‘]));
Writeln(impressora, Format(‘%-50s’,[‘ -
Cobrar Juros de 10%/Mes Apos
Vencimento’]));
WriteLn(impressora);
Writeln(impressora);
Writeln(impressora, Format(‘%-50s’,
[”+DmDados.TbcontasRecRazao.Value+’-
CGC/CPF’+Dmdados.TbContasRecCgc.Value]));
Writeln(impressora, Format(‘%-50s’,
[”+DmDados.TbContasRecEndereco.Value]));
Writeln(impressora, Format(‘%-50s’,[‘
CEP’+DmDados.TbContasRecCEP.Value+”+Dmdado
s.TbContasRecCidade.Value+”+
Dmdados.TbContasRecEstado.Value]));
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormMouseDown(Sender: TObject;
Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
contador:integer;
implementation
{$R *.DFM}
uses stdctrls;
procedure TForm1.FormMouseDown(Sender:
TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var b:tbutton;
begin
b:=Tbutton.create(self);
b.visible:=false;
b.parent:=self;
b.left:=x;
b.top:=y;
b.name:=‘Btn’+inttostr(contador);
b.Caption:=‘Clique-me’;
inc(contador);
b.visible:=true;
end;
procedure TForm1.FormCreate(Sender:
TObject);
begin
contador:=1;
end;
end.
============fim do copia e cola==========
Se quiser associar um evento ao botao é só copiar os
procedimento clicou e alterar
o procedmento mouse down para o que segue….
=======inicio do copia e cola
procedure TForm1.FormMouseDown(Sender:
TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var b:tbutton;
begin
b:=Tbutton.create(self);
b.visible:=false;
b.parent:=self;
b.left:=x;
b.top:=y;
b.name:=‘Btn’+inttostr(contador);
b.Caption:=‘Clique-me’;
inc(contador);
b.visible:=true;
b.onclick:=clicou;
end;
var
i, x: integer;
s: array [ 0..2047 ] of char;
begin
i := strToInt ( Edit1.text );
GetWindowText ( i, s, x );
Edit2.text := s;
end;
Autor da Dica
–––––––-
Eduardo
eduardo@mrsoftware.com.br
UIN 19495320
http://users.sti.com.br/sartel
EduDelphiPage
599 - Passando variáveis para o
ReportSmith
procedure TForm1.Button1Click(Sender:
TObject);
var
s: string;
begin
s:=‘CA’;
Report1.InitialValues.Add(‘@state=
<’+s+’>’);
Report1.run;
end;
600 - Adiciona a barra invertida a
um texto selecionado
function AddBarra(S: string): string;
var
Temp: string;
begin
Temp := S;
if S[Length(Temp)] <> ‘' then
Temp := Temp + ‘';
Result := Temp;
end;
601 - Como abrir um TComboBox
sem clicá-lo
ComboBox1.DroppedDown := True;
602 - Como Calcular Digito
Verificador de CNPJ e CPF
function CalculaCnpjCpf(Numero : String) :
String;
var
i,j,k, Soma, Digito : Integer;
CNPJ : Boolean;
begin
Result := Numero;
case Length(Numero) of
9:
CNPJ := False;
12:
CNPJ := True;
else
Exit;
end;
for j := 1 to 2 do
begin
k := 2;
Soma := 0;
for i := Length(Result) downto 1 do
begin
Soma := Soma + (Ord(Result[i])-
Ord(‘0’))*k;
Inc(k);
if (k > 9) and CNPJ then
k := 2;
end;
Digito := 11 - Soma mod 11;
if Digito >= 10 then
Digito := 0;
Result := Result + Chr(Digito +
Ord(‘0’));
end;
end;
Observação feita por um dos Usuários da DTDelphi
sobre a dica acima:
function IIf(pCond:Boolean;pTrue,pFalse:Variant):
Variant;
begin
If pCond Then Result := pTrue
else Result := pFalse;
end;
{Ass:Jefferson Bompadre}
604 - Desenhando texto 3D no
form com Canvas
Antes vc deve declarar esa procedure na seção private
procedure TForm1.imgPaintCanvas(TheCanvas
: TCanvas; TheString : String;
TheFontSize, UCorner, LCorner :
Integer);
Begin
TheCanvas.Brush.Style := bsClear;
TheCanvas.Font.Style := [fsBold];
TheCanvas.Font.Name := ‘MS Sans Serif’;
TheCanvas.Font.Size := TheFontSize;
TheCanvas.Font.Color := clBlack;
TheCanvas.TextOut(UCorner, LCorner,
TheString);
TheCanvas.Font.Color := clGray;
TheCanvas.TextOut(UCorner - 1, LCorner -
1, TheString);
TheCanvas.Font.Color := clSilver;
TheCanvas.TextOut(UCorner - 2, LCorner -
2, TheString);
TheCanvas.Font.Color := clBlack;
TheCanvas.TextOut(UCorner - 3, LCorner -
3, TheString);
End;
Exemplo:
procedure TForm1.Button1Click(Sender:
TObject);
begin
imgPaintCanvas(Form1.Canvas,
‘WWW.LLOYDSOFT.HPG.COM.BR’, 10, 6, 4);
end;
605 - Como saber há quanto tempo
o WINDOWS foi inicializado?
Use a função GetTickCount da API do Windows. Ela
retorna o intervalo em milisegundos.
Obs.: Esta função é útil quando se quer determinar o
intervalo de tempo decorrido durante uma ação de um
aplicativo.
Ex.:
var
TempoInicial, TempoFinal, Intervalo:
Integer
begin
TempoInicial := GetTickCount;
…
// código a ser executado
…
TempoFinal := GetTickCount;
Intervalo := TempoFinal - TempoInicial;
end.
606 - Como alterar o tamanho do
papel na impressão?
Esta dica refere-se à utilização do objeto TQRPrinter.
Use a propriedade PaperSize.
Ex.
// não se esqueça de colocar QRPrntr na
cláusula uses de sua unit.
var
PrintTeste: TQRPrinter;
begin
PrintTeste := TQRPrinter.Create;
PrintTeste.PaperSize := A4; {os
parâmetros podem ser A5, B5, Letter e
outros}
end;
607 - Como filtrar registros de
uma tabela pelo mês de um campo
data
Você pode usar a função DecodeDate( ) no evento
onFilterRecord de um componente TTable.
Ex.:
// não se esqueça de mudar a propriedade
Filtered para True;
// isto fará com que o evento
onFilterRecord seja disparado.
procedure
TForm1.Table1FilterRecord(DataSet:
TDataSet; var Accept: Boolean);
var
Dia, Mes, Ano: word;
begin
Accept := false;
DecodeDate(Table1[‘Competencia’],Ano,Mes,D
ia);
if Mes=MesFiltrado then
Accept := True;
end;
Obs.: Você pode usar este mesmo código para filtrar por
Ano ou por Dia, basta utilizar a comparação adequada
no bloco if … then
608 - Otimizações SQL
As dicas abaixo foram testadas essencialmente com
Oracle
1) Todas as vezes que for utilizar um SQL que
possua condições de OR, é mais aconselhável e
mais rápido utilizar IN, como no exemplo:
AO INVÉS DE
Select * from projint where sit_projint = ‘AI’ or sit_projint
= ‘EL’
COLOQUE
Select * from projint where sit_projint IN (‘AI’,‘EL’);
2) Quando existem duas ou mais condições AND
juntas, especifique primeiro sempre a que possui o
maior limite de ocorrências
AO INVÉS DE
select count(*) from pessoa where sit_pessoa = 11
AND cod_munic > 1100155
COLOQUE
select count(*) from pessoa where cod_munic >
1100155 AND sit_pessoa = 11
3) Quando existem duas ou mais condições OR
juntas, especifique primeiro sempre a que possui o
maior limite de ocorrências
AO INVÉS DE
select count(*) from pessoa where cod_munic >
1100155 OR sit_pessoa = 11
COLOQUE
select count(*) from pessoa where sit_pessoa = 11 OR
cod_munic > 1100155
4) Tenha cuidado com o sinal de <>
AO INVÉS DE
select count(*) from pessoawhere cod_munic < >
1100155
COLOQUE
select count(*) from pessoawhere cod_munic <
1100155 OR cod_munic > 1100155
609 - Excluindo registros de uma
tabela
Desejo excluir registro de uma tabela que dependem da
existência de outros de outra(s) tabela(s), como fazer?
DELETE FROM <tabela1>
WHERE (<campo1>, <campo2>,<campo3>)
IN
(SELECT <campo1>, <campo2>,<campo3>
FROM <tabela1> a, <tabela2> b
WHERE a.<campo1> = b.<campo1>
AND b.<campo4> = ‘AP’ )
colaboração: Renato Costa Pereira - Brasília-DF
610 - Selecionando registros de
uma tabela que não existam em
outra tabela
(SELECT * FROM <tabela1>, <tabela2>
WHERE <tabela1>.<campo1> = <tabela2>.<campo1>
AND <tabela2>.<campo2> = ‘AP’
MINUS
(SELECT * FROM <tabela1>@remoto1,
<tabela2>@remoto1
WHERE <tabela1>@remoto1.<campo1> =
<tabela2>@remoto1.<campo1>
AND <tabela2>@remoto1.<campo2> = ‘AP’
SELECT
META_GB.COD_PROJINT,
META_GB.COD_METPADRAO,
METAPADRAO.DES_METPADRAO,
METAPADRAO.COD_UNIDMED,
UNIDMED.SIG_UNIDMED
FROM
META_GB,
METAPADRAO,
UNIDMED
WHERE
( META_GB.COD_METPADRAO =
METAPADRAO.COD_METPADRAO ) and
(METAPADRAO.COD_UNIDMED =
UNIDMED.COD_UNIDMED) and
( META_GB.COD_PROJINT = :Param1 )
GROUP BY
META_GB.COD_PROJINT,
META_GB.COD_METPADRAO,
METAPADRAO.DES_METPADRAO,
METAPADRAO.COD_UNIDMED,
UNIDMED.SIG_UNIDMED
-> no delphi…
valor:=FormatFloat(‘000000000000.00’,liter
al);
i:=1;
while i<=13 do
begin
if (Pos(valor[i],‘0123456789’)=0) then
valor[i ] := ‘0’;
if (Pos(valor[i+1],‘0123456789’)=0) then
valor[i+1] := ‘0’;
if (Pos(valor[i+2],‘0123456789’)=0) then
valor[i+2] := ‘0’;
if (i=13) then
centena:=0
else
centena := StrToInt(valor[i]);
dezena := StrToInt(valor[i+1]);
if dezena>1 then
unidade := StrToInt(valor[i+2])
else
unidade := StrToInt(copy(valor,
(i+1),2));
if (((i=13) and
(StrToFloat(copy(valor,14,2))>0.01)) and
((StrToFloat(copy(valor,1,12)))<>0.00))
then
extenso:=Trim(extenso)+’ e’;
monta:=‘duzentos trezentos
quatrocentosquinhentos seiscentos
setecentos oitocentos novecentos’;
if ((dezena+unidade)=0) then
monta:=’ cem ‘+monta
else
monta:=’ cento ‘+monta;
extenso:=Trim(extenso)+’
‘+Trim(copy(monta,((centena*12)+1),12));
if ((centena<>0) and
((dezena+unidade)>0)) then
extenso:=Trim(extenso)+’ e’;
monta:=’ vinte trinta quarenta
cincoentasessenta setenta oitenta
noventa’;
extenso:=Trim(extenso)+’
‘+Trim(copy(monta,((dezena*9)+1),9));
if ((dezena>1) and (unidade>0)) then
extenso:=Trim(extenso)+’ e’;
monta:=’ um dois tres quatro cinco seis
sete oito nove dez onze doze treze
quatorze quinze dezeseis dezesete dezoito
dezenove’;
extenso:=Trim(extenso)+’
‘+Trim(copy(monta,((unidade*9)+1),9));
if ((centena+dezena+unidade)>0) then
begin
if i=1 then
if (((centena+dezena)=0) and
(unidade<=1)) then
extenso:=Trim(extenso)+’ bilhão’
else
extenso:=Trim(extenso)+’ bilhões’;
if (i=4) then
if ((centena+dezena=0) and
(unidade<=1))then
extenso:=Trim(extenso)+’ milhão’
else
extenso:=Trim(extenso)+’ milhões’;
if i=7 then
extenso:=Trim(extenso)+’ mil’;
if ((i<10) and (StrToFloat(copy(valor,
(i+3),(13-i)))>1.00))then
extenso:=extenso+’ e’;
end;
if ((i=1) and
(StrToFloat(copy(valor,4,9))=0.00) and
((centena+unidade+dezena)<>0)) then
extenso:=Trim(extenso)+’ de’;
if ((i=4) and
(StrToFloat(copy(valor,7,6))=0.00) and
((centena+unidade+dezena)<>0)) then
extenso:=Trim(extenso)+’ de’;
if ((i=10) and
(StrToFloat(copy(valor,1,12))<>0.00)) then
if (StrToFloat(copy(valor,1,12))=1.00)
then
extenso:=Trim(extenso)+’ real’
else
extenso:=Trim(extenso)+’ reais’;
if ((i=13) and ((dezena+unidade)<>0))
then
if ((dezena+unidade)=1) then
extenso:=Trim(extenso)+’ centavo’
else
extenso:=Trim(extenso)+’ centavos’;
i:=i+3;
end;
if literal<0.00 then
extenso:=Trim(extenso)+’ negativo’;
if (literal<1.0) then
if (StrToInt(copy(valor,14,2))=1) then
extenso:=Trim(extenso)+’ de real’ // “de
real/de reais” podem ser substituidos por
campos de arquivos de parametros
else // o que dá mais flexibilidade,
caso aconteçam mais planos econômicos.
extenso:=Trim(extenso)+’ de reais’;
result:=extenso;
end;
end;
626 - Rotina para apagamento da
senha do setup
procedure TForm1.Button1Click(Sender:
TObject);
begin
asm
mov ax,2eh
out 70h,ax
mov ax,2fh
out 71h,ax
end;
end;
627 - Imprime o conteúdo de um
TRichEdit
procedure PrintRichEdit(const Caption:
string;const RichEdt: TRichEdit);
// Requer a Printers e RichEdit declaradas
na clausula uses da unit
var
Range: TFormatRange;
LastChar, MaxLen, LogX, LogY, OldMap:
Integer;
begin
FillChar(Range, SizeOf(TFormatRange), 0);
with Printer, Range do
begin
BeginDoc;
hdc := Handle;
hdcTarget := hdc;
LogX := GetDeviceCaps(Handle, LOGPIXELSX);
LogY := GetDeviceCaps(Handle, LOGPIXELSY);
if IsRectEmpty(RichEdt.PageRect) then
begin
rc.right := PageWidth * 1440 div LogX;
rc.bottom := PageHeight * 1440 div LogY;
end
else
begin
rc.left := RichEdt.PageRect.Left * 1440
div LogX;
rc.top := RichEdt.PageRect.Top * 1440 div
LogY;
rc.right := RichEdt.PageRect.Right * 1440
div LogX;
rc.bottom := RichEdt.PageRect.Bottom *
1440 div LogY;
end;
rcPage := rc;
Title := Caption;
LastChar := 0;
MaxLen := RichEdt.GetTextLen;
chrg.cpMax := -1;
OldMap := SetMapMode(hdc, MM_TEXT);
SendMessage(RichEdt.Handle,
EM_FORMATRANGE, 0, 0);
try
repeat
chrg.cpMin := LastChar;
LastChar := SendMessage(RichEdt.Handle,
EM_FORMATRANGE, 1,Longint(@Range));
if (LastChar < MaxLen) and (LastChar < -1)
then
begin
NewPage;
end;
until (LastChar = MaxLen) or (LastChar =
-1);
EndDoc;
finally
SendMessage(RichEdt.Handle,
EM_FORMATRANGE, 0, 0);
SetMapMode(hdc, OldMap);
end;
end;
end;
628 - Como saber se estou
conectado à internet
interface
uses
Windows, SysUtils, Registry, WinSock,
WinInet;
type
TConnectionType = (ctNone, ctProxy,
ctDialup);
function ConnectedToInternet :
TConnectionType;
function RasConnectionCount : Integer;
implementation
const
cERROR_BUFFER_TOO_SMALL = 603;
cRAS_MaxEntryName = 256;
cRAS_MaxDeviceName = 128;
cRAS_MaxDeviceType = 16;
type
ERasError = class(Exception);
HRASConn = DWord;
PRASConn = ^TRASConn;
TRASConn = record
dwSize: DWORD;
rasConn: HRASConn;
szEntryName: Array[0..cRAS_MaxEntryName]
Of Char;
szDeviceType :
Array[0..cRAS_MaxDeviceType] Of Char;
szDeviceName : Array
[0..cRAS_MaxDeviceName] of char;
end;
TRasEnumConnections =
function (RASConn: PrasConn; { buffer para
receber dados da conexao}
var BufSize: DWord; { tamanho em bytes do
buffer }
var Connections: DWord { numero de
conexoes escritas no buffer }
): LongInt; stdcall;
function ConnectedToInternet:
TConnectionType;
var
Reg : TRegistry;
bUseProxy : Boolean;
UseProxy : LongWord;
begin
Result := ctNone;
Reg := TRegistry.Create;
with REG do
try
try
RootKey := HKEY_CURRENT_USER;
if
OpenKey(‘\Software\Microsoft\Windows\Curre
ntVersion\Internet settings’,False) then
begin
//I just try to read it, and trap an
exception
if GetDataType(‘ProxyEnable’) = rdBinary
then
ReadBinaryData(‘ProxyEnable’, UseProxy,
SizeOf(LongWord) )
else begin
bUseProxy := ReadBool(‘ProxyEnable’);
if bUseProxy then
UseProxy := 1
else
UseProxy := 0;
end;
if (UseProxy <> 0) and (
ReadString(‘ProxyServer’) <> ” ) then
Result := ctProxy;
end;
except
//Nao conectado com proxy
end;
finally
Free;
end;
If (RasResult = 0) or (Result =
cERROR_BUFFER_TOO_SMALL) then Result :=
NumConns;
finally
FreeLibrary(RasDLL);
end;
end;
629 - . Acessando o banco de
dados Oracle a partir do Delphi
Em vista de muitos hoje possuírem sistemas rodando
com banco de dados Oracle, resolvemos publicar em
detalhes todos passos necessários para se conectar a
um banco Oracle a partir do Delphi de modo nativo
(usando BDE) e através do ODBC. Temos observado
também que dúvidas sobre este assunto estão sempre
presentes nas listas de discussão sobre Delphi e sobre
Oracle.
Utilizamos com bons resultados as versões do Delphi
2.0 até a 4.0, BDE versões 4.5 e 5.0, e o Oracle7
Workgroup Server Release 7.3.2.1. Naturalmente tais
informações serão de grande ajuda para configuração
em outras versões.
Passos:
1 - Caso tenha instalado em sua máquina algum cliente
do Oracle 16 bits, poderá ter algum tipo de conflito com
drives de 32 bits. Portanto, desinstale todos os clientes
Oracle e instale somente o cliente Oracle 32 bits.
Normalmente isto é feito a partir do CD de instalação do
Oracle executando o programa d:\win95\install\setup.exe
2 - Ao executar o instalador do cliente Oracle para
Windows 95, você deverá de inicio informar o idioma (o
mesmo que foi informado durante a instalação do
próprio banco), tendo o English como padrão.
3 - Entre com o nome da empresa e o diretório onde
serão armazenados os arquivos do cliente Oracle.
4 - Será solicitado o tipo da instalação. Escolha a opção
“Selective Products Install”.
5 - Será apresentada uma lista dos produtos ou
componentes disponíveis. Apesar de poder instalar
todos, serão apenas necessários para a conexão com o
banco Oracle a partir do Delphi os seguintes
componentes:
Sql *Net Client (para criação do alias no cliente Oracle)
Oracle Installer (para instalar/remover componentes)
6 - Selecione os protocolos desejados para
comunicação com o banco, ou poderá deixar
selecionado a sugestão do instalador e prosseguir.
7 - Após completar 100% da instalação, você visualizará
os componentes instalados:
Oracle Installer
Oracle Named Pipes Adapter (protocolo de acordo com
sua rede)
Oracle SPX Adapter (protocolo de acordo com sua rede)
Oracle TCP/IP Adapter (protocolo de acordo com sua
rede)
Required Support Files
Sql *Net Client
8 - Saia do instalador. Não será necessário reiniciar a
máquina por enquanto.
9 - Clique no botão iniciar -> programas -> Oracle for
windows 95 -> Sql Net Easy Configuration
10 - Selecione “Add Database Alias”, e clique OK
11 - Informe na sequência:
Database Alias (nome na sua máquina que representará
o acesso ao banco)
Escolha o Protocolo (normalmente TCP/IP)
TCP/IP Host Name (informe o numero IP do servidor
Oracle)
Database Instance (nome da instância do banco,
consulte o DBA)
12 - Clique em “yes” e saia do Sql Net Easy
Configuration
13 - Chame o BDE Administrator, e clique na guia
Configuration -> Drivers ->Native e selecione ORACLE.
Como sugestão use as seguintes configurações:
VERSION 4.0
TYPE SERVER
DLL32 SQLORA32.DLL
TRACE MODE 0
BLOB SIZE 32
BLOBS TO CACHE 64
MAX ROWS –1
ROWSET SIZE 20
SCHEMA CACHE 8
SIZE
SCHEMA CACHE –1
TIME
SERVER NAME (COLOQUE O NOME DA INSTANCIA
DO BANCO, DEFAULT: ORCL)
SQLPASSTHRU AUTOCOMMIT
MODE SHARED
SQLQRYMODE SERVER
procedure TForm1.Button1Click(Sender:
TObject);
begin
ShowMessage(GetURL(‘IExplore’));
end;
631 - Compara dois arquivos textos
procedure TForm1.Button1Click(Sender:
TObject);
var
filename1 : string;
filename2 : string;
begin
filename1 := Edit1.Text;
filename2 := Edit2.Text;
compfile(filename1, filename2);
showmessage(‘Veja o resultado no arquivo
c:Tempdiff.txt’);
end;
procedure tform1.compfile(filename1,
filename2 : string);
var
f1 : system.textfile;
f2 : system.textfile;
diff : system.textfile;
buf1 : string;
buf2 : string;
l : integer;
begin
assignfile(f1, filename1);
assignfile(f2, filename2);
assignfile(diff, ‘c:Tempdiff.txt’);
reset(f1);
reset(f2);
rewrite(diff);
l := 1;
while not eof(f1) do
begin
readln(f1, buf1);
readln(f2, buf2);
if not (compstr(buf1, buf2) )then
begin
writeln(diff, ‘line: ‘+ inttostr(l) + ‘-‘
+ buf1);
writeln(diff, ‘line: ‘+ inttostr(l) + ‘-‘
+ buf2);
writeln(diff, ‘ ‘);
end;
inc(l);
end;
closefile(f1);
closefile(f2);
closefile(diff);
end;
type
PRecInfo=^TRecInfo;
Trecinfo=record
prev:PRecInfo;
fpathname:string;
srchrec:Tsearchrec;
end;
implememtation
function
TForm1.RecurseDirectory(fname:string):tstr
inglist;
var
f1,f2:Tsearchrec;
p1,tmp:PRecInfo;
fwc:string;
fpath:string;
fbroke1,fbroke2:boolean;
begin
result:=tstringlist.create;
fpath:=extractfilepath(fname);
fwc:=extractfilename(fname);
new(p1);
p1.fpathname:=fpath;
p1.prev:=nil;
fbroke1:=false;
fbroke2:=false;
while(p1<>nil) do
begin
if (fbroke1=false) then
if (fbroke2=false) then
begin
if (findfirst(fpath+’*’,faAnyfile,f1)<>0)
then
break;
end
else if (findnext(f1)<>0) then
begin
repeat
findclose(f1);
if (p1=nil) then
break;
fpath:=p1.fpathname;
f1:=p1.srchrec;
tmp:=p1.prev;
dispose(p1);
p1:=tmp;
until (findnext(f1)=0);
if (p1=nil) then
break;
end;
if((f1.Name<>’.’) and (f1.name<>’..’) and
((f1.Attr and fadirectory)=fadirectory))
then
begin
fbroke1:=false;
new(tmp);
with tmp^ do
begin
fpathname:=fpath;
srchrec.Time:=f1.time;
srchrec.Size:=f1.size;
srchrec.Attr:=f1.attr;
srchrec.Name:=f1.name;
srchrec.ExcludeAttr:=f1.excludeattr;
srchrec.FindHandle:=f1.findhandle;
srchrec.FindData:=f1.FindData;
end;
tmp.prev:=p1;
p1:=tmp;
fpath:=p1.fpathname+f1.name+’';
if findfirst(fpath+fwc,faAnyfile,f2)=0
then
begin
result.add(fpath+f2.Name);
while(findnext(f2)=0) do
result.add(fpath+f2.Name);
findclose(f2);
end;
fbroke2:=false;
end
else
begin
if (findnext(f1)<>0) then
begin
findclose(f1);
fpath:=p1.fpathname;
f1:=p1.srchrec;
fbroke1:=false;
fbroke2:=true;
tmp:=p1.prev;
dispose(p1);
p1:=tmp;
end
else
begin
fbroke1:=true;
fbroke2:=false;
end;
end;
end;
fpath:=extractfilepath(fname);
if findfirst(fname,faAnyfile,f1)=0 then
begin
result.add(fpath+f2.Name);
while(findnext(f1)=0) do
result.add(fpath+f2.Name);
findclose(f1);
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
var
l1:Tstringlist;
begin
l1:=tstringlist.create;
listbox1.items.clear;
listbox1.Items.BeginUpdate;
l1:=recursedirectory1(‘C:\*.exe’);
listbox1.items.assign(l1);
freeandnil(l1);
listbox1.Items.endUpdate;
end;
633 - Como desabilitar o menu pop-
up do windows(Na area de trabalho)
Set a seguinte chave no registro do windows:
HKey_Current_User\Software\Microsoft\Windows\Curren
tVersion\Policies\Explore
r\NoViewContextMenu para 0 habilita o click com o
botao direito e 1 desabilita.
634 - Como inserir um item em um
TreeView em Run Time
procedure TForm1.Button1Click(Sender:
TObject);
var
MyTreeNode1, MyTreeNode2: TTreeNode;
begin
with TreeView1.Items do
begin
Clear; { Remove qualquer node existente }
MyTreeNode1 := Add(nil, ‘RootTreeNode1’);
{ Adiciona o node raiz }
{ Adiciona um sub item no node adiciona
anteriormente }
AddChild(MyTreeNode1,‘ChildNode1’);
{Adiciona outro node raiz}
MyTreeNode2 := Add(MyTreeNode1,
‘RootTreeNode2’);
AddChild(MyTreeNode2,‘ChildNode2’);
MyTreeNode2 := TreeView1.Items[3];
AddChild(MyTreeNode2,‘ChildNode2a’);
Add(MyTreeNode2,‘ChildNode2b’);
Add(MyTreeNode1, ‘RootTreeNode3’);
end;
end;
635 - Como chamar a pasta
impressoras
Arquivo := ‘Control’;
Parametro := ‘Printers’;
ShellExecute(0, ‘open’, PChar(Arquivo),
PChar(Parametro), nil, SW_ShowNormal);
* colocar na uses shellapi;
636 - Mudar Impressora padrão
pelo nome
procedure SetDefaultPrinter(PrinterName:
String);
var
I: Integer;
Device : PChar;
Driver : Pchar;
Port : Pchar;
HdeviceMode: Thandle;
aPrinter : TPrinter;
begin
Printer.PrinterIndex := -1;
getmem(Device, 255);
getmem(Driver, 255);
getmem(Port, 255);
aPrinter := TPrinter.create;
for I := 0 to Printer.printers.Count-1
do
begin
if Printer.printers[i] = PrinterName
then
begin
aprinter.printerindex := i;
aPrinter.getprinter
(device, driver, port, HdeviceMode);
StrCat(Device, ‘,’);
StrCat(Device, Driver );
StrCat(Device, Port );
WriteProfileString(‘windows’, ‘device’,
Device);
StrCopy( Device, ‘windows’ );
SendMessage(HWND_BROADCAST,
WM_WININICHANGE,
0, Longint(@Device));
end;
end;
Freemem(Device, 255);
Freemem(Driver, 255);
Freemem(Port, 255);
aPrinter.Free;
end;
637 - Função para gerar Log de
Erros
function SaveLogError(Const AUnitError,
ASimbolError, ADescription, ATypeError,
ASQLError, AInsError: string): integer;
var
VMemory: TMemoryStatus;
VLogFile: TextFile;
VLogFileName: string;
vcount : Integer;
begin
VMemory.dwLength :=
SizeOf(TMemoryStatus);
GlobalMemoryStatus(VMemory);
VLogFileName := format(‘%spdferror.log’,
[GPathFile]);
try
AssignFile(VLogFile,VLogFileName);
if FileExists(VLogFileName) then
begin
Append(VLogFile);
Writeln(VLogFile,”);
Writeln(VLogFile,’––––––––––––––––––––—’);
Writeln(VLogFile,”);
end
else
begin
Rewrite(VLogFile);
Writeln(VLogFile,‘CABTEC - Soluções em
códigos de barras’);
Writeln(VLogFile,format(‘Fone %s - E-
Mail: cabtec@cabtec.com.br’,’(0xx31)3295-
0555’]));
Writeln(VLogFile,‘Rua Araguari, nº
358/16º andar - Barro Preto’);
Writeln(VLogFile,‘20190-110 - Belo
Horizonte - MG’);
Writeln(VLogFile,’========================
======================================’);
Writeln(VLogFile,”);
end;
Writeln(VLogFile,format(‘DATE/TIME…………:
%s’,[DateTimeToStr(Now)]));
Writeln(VLogFile,format(‘Unit
Error………..: %s’,[AUnitError]));
Writeln(VLogFile,format(‘Call
Symbol……….: %s’,[ASimbolError]));
Writeln(VLogFile,format(‘Error
type………..: %s’,[ATypeError]));
Writeln(VLogFile,format(‘Description……….:
%s’,[ADescription]));
Writeln(VLogFile,format(‘SQL Error…………:
%s’,[ASQLError]));
Writeln(VLogFile,format(‘Instruction
error….: %s’,[AInsError]));
Writeln(VLogFile,”);
Writeln(VLogFile,format(‘Memory
free……….: %.0f bytes’,
[(VMemory.dwAvailPhys / 1024)])); // bytes
livres de memória física
Writeln(VLogFile,format(‘Total
PageFile…….: %.0f
bytes’,[(VMemory.dwTotalPageFile /
1024)])); // bytes livres de paginação de
arquivo // bytes de paginação de arquivo
Writeln(VLogFile,format(‘Avail
PageFile…….: %.0f
bytes’,[(VMemory.dwAvailPageFile /
1024)])); // bytes em uso de espaço de
endereço
Writeln(VLogFile,format(‘Total Virtual
…….: %.0f
bytes’,[(VMemory.dwTotalVirtual /
1024)]));
Writeln(VLogFile,format(‘Avail virtual
free…: %.0f
bytes’,[(VMemory.dwAvailVirtual /
1024)])); // bytes livres
CloseFile(VLogFile);
result := IOResult;
except
result := IOResult;
result := -1;
end;
end;
para chamá-la faça assim:
try
Post;
result := True;
except
on E: Exception do
begin
SaveLogError(‘Unit_nota’,‘function
TForm_Nota.SetSaveItensData: boolean’,
E.Message, E.ClassName, ”, ‘Post’);
Application.MessageBox(‘Ocorreu um erro ao
gravar os dados na tabela de
ITENS!’,CCAPTIONAPPLICATIONTITLE,mb_Ok +
mb_IconStop + mb_DefButton1 +
mb_applmodal);
Cancel;
result := False;
break;
end;
end;
639 - MessageBox com o NÃO
como default
If Application.MessageBox(‘Deseja
Continuar??’,‘Confirmação’,MB_ICONQUESTION
+ MB_YESNO+MB_DEFBUTTON2)=idyes then
640 - Como verificar que sua
aplicação não está sendo utilizada
Voce pode testar, caso sua aplicacao tenha um unico
formulario, o evento OnDeactivate do formulario.
Mas, o melhor mesmo eh com a aplicacao.
Digite o seguinte codigo, no formulario principal:
TSeuFormulario = class (Tform)
public
procedure Desabilitou (Sender : TObject);
Isso voce deve ter notado que deve acrescentar um
metodo, manualmente, ao seu formulario.
A implementacao serah:
procedure TSeuFormulario.Desabilitou
(Sender : TObject);
Begin
{O que voce deseja fazer}
End;
No create de seu formulario principal, digite a linha
abaixo:
Application.OnDeactivate := Desabilitou;
Pronto.
641 - Como enviar mensagem para
todos que estão conectados na
REDE WinNT
function NetSend(dest, source, msg:
string): longint;
type
TNetMessageBufferSendFunction =
function(servername, msgname, fromname:
PWideChar; buf: PWideChar; buflen:
Cardinal): longint; stdcall;
var
NetMessageBufferSend:
TNetMessageBufferSendFunction;
SourceWideChar: PWideChar;
DestWideChar: PWideChar;
MessagetextWideChar: PWideChar;
Handle: THandle;
begin
Handle := LoadLibrary(‘NETAPI32.DLL’);
if Handle = 0 then
begin
Result := GetLastError;
exit;
end;
@NetMessageBufferSend :=
GetProcAddress(Handle,
‘NetMessageBufferSend’);
if @NetMessageBufferSend = nil then
begin
Result := GetLastError;
exit;
end;
MessagetextWideChar := nil;
SourceWideChar := nil;
DestWideChar := nil;
try
GetMem(MessagetextWideChar, Length(msg)
* SizeOf(WideChar) + 1);
GetMem(DestWideChar, 20 *
SizeOf(WideChar) + 1);
StringToWideChar(msg,
MessagetextWideChar, Length(msg) *
SizeOf(WideChar) + 1);
StringToWideChar(Dest, DestWideChar, 20
* SizeOf(WideChar) + 1);
if source = ” then
result := NetMessageBufferSend(nil,
DestWideChar, nil,
MessagetextWideChar, Length(msg) *
SizeOf(WideChar) + 1)
else
begin
GetMem(SourceWideChar, 20 *
SizeOf(WideChar) + 1);
StringToWideChar(source, SourceWideChar,
20 * SizeOf(WideChar) + 1);
result := NetMessageBufferSend(nil,
DestWideChar, SourceWideChar,
MessagetextWideChar, Length(msg) *
SizeOf(WideChar) + 1);
freemem(SourceWideChar);
end;
finally
FreeMem(MessagetextWideChar);
FreeLibrary(Handle);
end;
end;
642 - Criando um arquivo de texto
procedure AddLog;
var
log: textfile;
begin
try
AssignFile(log, ‘c:\log.log’);
if not FileExists(‘c:\log.log’) then
Rewrite(log,‘c:\log.log’);
Append(log);
WriteLn(log, ‘informações a serem
inclusas’);
finally
CloseFile(log);
end;
end;
643 - Problema com Null no Delphi
6
declare VARIANTS no USES e pronto
644 - Foto no InterBase
procedure
TFrmCredenc.CarregaFotoParaBanco(FileName:
String);
Var
stImagem: TFileStream;
begin
stImagem := TFileStream.Create(
FileName, fmOpenRead or
fmShareDenyWrite );
Try
// ibdsCredenciadosFOTO é um campo BLOB
SUB_TYPE 0
DMMain.ibdsCredenciadosFOTO.LoadFromStream
( stImagem );
Finally
stImagem.Free;
End;
end;
procedure
TFrmCredenc.ObtemImagemDoBanco(var
imgDestino: TImage);
Var
jpgImg: TJPEGImage;
stMem: TMemoryStream;
begin
If DMMain.ibdsCredenciadosFOTO.IsNull
Then Exit;
jpgImg := TJPEGImage.Create;
stMem := TMemoryStream.Create;
Try
DMMain.ibdsCredenciadosFOTO.SaveToStream(
stMem );
stMem.Position := 0;
jpgImg.LoadFromStream( stMem );
imgDestino.Picture.Assign( jpgImg );
Finally
stMem.Free;
jpgImg.Free;
End;
end;
645 - Comandos para Threads
minhathread.pause; {da pausa na thread }
minhathread.resume; { reinicia a thread }
minhathread.terminate; { termina a thread
}
minhatrhread.execute; { executa a thread }
646 - A melhor maneira de liberar
um form da memoria
Quando você usa Form.Free ou Form.Destroy, você
está imediatamento solicitando a destruição do
formulário. Com Form.Release, todas as mensagens
pendentes no pool do formulário são postadas -
exemplo: redesenho do formulário, movimento do
mouse, pressionamento de tecla,…
use assim:
if ARow=Linha
then Grid.Options := Grid.Options +
[goEditing]
else Grid.Options := Grid.Options -
[goEditing];
649 - Como gravar as alterações
feitas no DBGrid em tempo de
execução
Se você quer salvar apenas as configurações de um
DBGrid, faça assim:
DBGrid1.Columns.SaveToFile(‘c:\nome_arquiv
o’);
para abrir:
DBGrid1.Columns.LoadFromFile((‘c:\nome_arq
uivo’);
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
WGiro : Integer;
WMesage : String;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender:
TObject);
begin
Form1.Caption := WMesage;
Case WGiro of
1: begin
if Length(WMesage)<= 1 then
begin
WMesage := ‘ W’;
WGiro := (WGiro + 1);
end;
WMesage := Copy(WMesage, 2,250);
end;
2: begin
if Length(WMesage)<= 2 then
begin
WMesage := ‘ I’;
WGiro := (WGiro + 1);
end;
WMesage := Copy(WMesage, 3,250);
end;
3: begin
if Length(WMesage)<= 3 then
begin
WMesage := ‘ L ‘;
WGiro := (WGiro + 1);
end;
WMesage := ‘W’ + Copy(WMesage, 4,250);
end;
4: begin
if Length(WMesage)<= 4 then
begin
WGiro := (WGiro + 1);
end;
WMesage := ‘WI’ + Copy(WMesage, 5,250);
end;
5: begin
if Length(WMesage)<= 5 then
begin
WGiro := 1;
end;
WMesage := ‘WIL’ + Copy(WMesage, 6,250);
end;
end;
end;
procedure TForm1.FormShow(Sender:
TObject);
begin
Timer1.Enabled := True;
WMesage := ‘ ‘;
WGiro := 1;
end;
end.
Application.OnMessage := MudarComEnter;
Dica Enviada por Márcio Souza
652 - Mudando a cor dos
componentes assim que receber o
foco
Uses
Typinfo
procedure TForm1.ColorControl(Sender:
TObject);
var
Cor: TColor;
I: integer;
begin
With Screen.ActiveForm do
begin
for I:= 0 to ComponentCount -1 do
begin
if Components[I] is TCustomEdit then
begin
if (Components[I] as
TCustomEdit).Focused then
Cor := clRed
else
Cor := clWindow;
AtribuiProp(Components[I], ‘Color’,
IntToStr(Cor));
end;
end;
end;
end;
procedure TForm1.FormCreate(Sender:
TObject);
begin
Screen.OnActiveControlChange :=
ColorControl;
end;
procedure TForm1.FormClose(Sender:
TObject; var Action: TCloseAction);
begin
Screen.OnActiveControlChange := nil;
end;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
ImgList, ComCtrls;
type
TForm1 = class(TForm)
StatusBar1: TStatusBar;
ImageList1: TImageList;
procedure StatusBar1DrawPanel(StatusBar:
TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
{Adicione um StatusBar e um ImageList,
iclua no imagelist as figuras que deseja
mostrar apos mude a propriedade Style dos
Panels do StatusBar para psOwnerDraw,
em seguida inclua o codigo abaixo no
evento OnDrawPanel do StatusBar}
procedure
TForm1.StatusBar1DrawPanel(StatusBar:
TStatusBar;
Panel: TStatusPanel; const Rect: TRect);
begin
with StatusBar1.Canvas do
begin
FillRect(Rect);
//Definir Font e Style
Font.Name := ‘Arial’;
Font.Color := ClNavy;
Font.Style := [FsBold];
//Desenha as imagens de acordo com o
indice de cada panel
ImageList1.Draw(StatusBar1.Canvas,Rect.Lef
t+5,Rect.Top+1,Panel.Index);
//Escreve o texto em cada panel
if Panel.Index = 0 then
TextOut(Rect.Left + 25, Rect.Top +
1,‘LloydSoft - Panel1’);
if Panel.Index = 1 then
TextOut(Rect.Left + 25, Rect.Top +
1,‘LloydSoft - Panel 1’);
if Panel.Index = 2 then
TextOut(Rect.Left + 25, Rect.Top +
1,‘LloydSoft - Panel 2’);
end;
end;
end.
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, Db, DBTables ;
type
TForm1 = class(TForm)
Label1: TLabel;
BitBtn1: TBitBtn;
Edit1: TEdit;
Table1: TTable;
Label2: TLabel;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
WAlias : TStringList; //Capitura o Alias
do Bde
WServidor : String; //Retorna o Caminho
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.BitBtn1Click(Sender:
TObject);
begin
{Para validar a Session e necessario ter
um compomente table anexado ao projeto}
WAlias := TStringList.Create;
// Session.GetAliasParams(‘CrAdm’,WAlias);
//Coloque o Alias diretamente ou Troque
pelo Edit
Session.GetAliasParams(Edit1.Text,WAlias)
;
WServidor := WAlias[0];
WServidor := Copy(WServidor,6,255);
WServidor := Copy(WServidor,1,
(Length(WServidor)));
Label1.Caption := WServidor;
end;
end.
{Dica enviada por William - Marilia/SP Capital
Nacional do Alimento}
657 - Como trocar a cor do
componente focado
Para mudar a cor do conponente que esta focado, e
depois voltar a cor quando não está mais focado.
No evento OnEnter.
Colocar as seguinter linhas de comando;
procedure TForm1.DBEdit1Enter(Sender:
TObject);
begin
// verificar o camponente
if (Sender is TDBEdit) then
// mudar a cor do componente
TDBEdit(Sender).Color:=ClBlue;
end;
No Evento OnExit:
Colocar as seguinter linhas de comando;
procedure TForm1.DBEdit1Exit(Sender:
TObject);
begin
// verificar o camponente
if (Sender is TDBEdit) then
// mudar a cor do componente
TDBEdit(Sender).Color:=clWindow;
end;
procedure TfrmLogin.SaveConfig;
var
IniFile : TIniFile;
FIniFileName : ShortString;
begin
FIniFileName :=
LowerCase(ExtractFileName(Application.ExeN
ame));
FIniFileName := Copy(FIniFileName, 1,
Length(FIniFileName) - 3) + ‘ini’;
IniFile :=
TIniFile.Create(FIniFileName);
IniFile.WriteString(SectionData,
KeyUser, LogonUserName );
IniFile.WriteString(SectionData,
KeyConnection, ConnectionString);
IniFile.Free;
end;
A variável FIniFile permite que sejam criados arquivos
INI com o mesmo nome da aplicação. Isso é bom e é
ruim. É bom se cada aplicacao acessar um banco
diferente. Ruim se elas acessam o mesmo banco. Neste
ultimo caso, é só dar um nome fixo ao INI.
procedure ExecutePrograma(Nome,
Parametros: String);
Var
Comando: Array[0..1024] of Char;
Parms: Array[0..1024] of Char;
begin
StrPCopy (Comando, Nome);
StrPCopy (Parms, Parametros);
ShellExecute (0, Nil, Comando, Parms,
Nil, SW_ShowMaximized);
end;
By Carlos Naves -
http://www.carlosnaves.hpg.com.br/
665 - Como desabilitar as teclas
Alt + F4
public
{ Public declarations }
fecha: Boolean;
end;
implementation
{$R *.DFM}
procedure Tfrm_HIP.FormClose(Sender:
TObject; var Action: TCloseAction);
begin
If Not fecha Then
Action := caNone Else
Action := caFree;
end;
procedure Tfrm_HIP.FormKeyDown(Sender:
TObject; var Key: Word;
Shift: TShiftState);
begin
If GetStateK (VK_LMENU) And (Key = VK_F4)
Then
fecha := False;
end;
TRadioButton(RADIOGROUP1.Controls[i]).Font
.Color := clGreen;
TRadioButton(RADIOGROUP1.Controls[i]).Font
.Style := [fsBold];
end;
TRadioButton(RADIOGROUP1.Controls[RADIOGRO
UP1.ItemIndex]).Font.Color := clRed;
TRadioButton(RADIOGROUP1.Controls[RADIOGRO
UP1.ItemIndex]).Font.Style := [fsBold];
end;
{Dica enviada por José do Amparo Soares}
667 - Como usar um frame em sua
aplicação
FORM Principal:
No “Form” principal do projeto, coloque um “Panel” para
o título do projeto ou apresentação com imagens, textos,
etc.
Panel - No Object Inspector:
Mude a propriedade “Align” para “alTop”. O tamanho -
Apenas “Height” (Altura) = 65, pois “Width” (largura) será
a do formulário pai.
FRAME:
Vamos criar os frames agora. Vá ao menu “File”, clicar
em “New Frame”. Abrirá um componente frame com o
nome de “Frame1”.
No Object Inspector, nas propriedades abaixo, fazer
alterações:
Name - Trocar o nome. (fraMenu - apenas
exemplo).
AutoScroll - True.
Height - 379.
Width - 140.
Coloque um Panel dentro do frame. Troque as
propriedades abaixo:
Name - Trocar o Nome.
Align - alClient.
Color - A cor desejada.
Caption - para vazio.
Dentro deste panel, coloque os componentes para
chamar os outros frames:
SpeedButton, BitBtn, Button, ou outros Panels, o que
desejar, desde que tenha o evento “OnClick”.
Para cada Button, Panel, etc. que chamar um formulário,
usar o comando abaixo.
Neste exemplo foi colocado um Panel, com o nome
pnlComponentes, para chamar um frame com o nome
de fraComponentes.
No OnClick deste componente, coloque o comando:
procedure
TfraMenu.pnlComponentesClick(Sender:
TObject);
begin
frmPrincipal.fraComponentes.Align:=alClien
t;
frmPrincipal.fraComponentes.Visible:=True;
frmPrincipal.fraComponentes.BringToFront;
End;
No form Principal, na palheta “Standard” do Delphi, dê
dois cliques no primeiro componente “Frames”,
aparecerá uma janela com os nomes dos frames já
criados. Escolha fraMenu: o sistema colocará este frame
dentro do form principal. O fraMenu que aparecer dentro
do form principal, trocar as propriedades abaixo:
Align - alLeft, isto colocará este frame a
esquerda no form principal.
Visible - True, isto fará com que este
frame ficará visível todo o tempo.
No fraMenu que aparece dentro do form principal, no
Evento “OnClick” deste Panel (pnlComponentes),
coloque o comando:
procedure
TfrmPrincipal.fraMenupnlComponentesClick(S
ender: TObject);
begin
fraMenu.pnlComponentesClick(Sender);
end;
procedure TfrmPrincipal.FormCreate(Sender:
TObject);
begin
fraMenu.pnlComponentes.Align:=alTop;
end;
Nos outros frames a serem criados, trocar as
propriedades abaixo:
Align - alNone.
Visible - False.
Com isto os frames dentro do form principal estarão
invisível, mas, quando clicar no componente dentro do
fraMenu, o frame chamado aparecerá.
{Dica enviada por José do Amparo Soares}
668 - Como trocar a cor do texto
de uma coluna do dbgrid
procedure
TForm1.DBGrid1DrawColumnCell(Sender:
TObject;
const Rect: TRect; DataCol: Integer;
Column: TColumn;
State: TGridDrawState);
begin
// Troca a cor de fundo do DBGrid
DBGrid1.Canvas.Brush.Color := clAqua;
if Column.Index = 1 then
begin
// Troca a cor do texto de uma coluna
DBGrid1.Canvas.Font.Color := clOlive;
end
else
DBGrid1.Canvas.Font.Color := clRed;
DBGrid1.Canvas.FillRect(Rect);
DBGrid1.Canvas.TextOut(Rect.Left+2,Rect.To
p,Column.Field.AsString);
end;
procedure TForm1.Button1Click(Sender:
TObject);
Var
Reg : TRegistry;
Begin
Reg := TRegistry.Create;
try
with Reg do
begin
RootKey := HKEY_CLASSES_ROOT;
OpenKey(‘\MeuPrograma’, True);
WriteString(”, ‘Arquivo do meu
programa’); //Nome dado ao arquivo de sua
aplicação. “Ex: Imagem Gif”.
CloseKey;
OpenKey(‘MeuPrograma\DefaultIcon’,
True);
// O primeiro parâmetro da linha de
comando abaixo, é para escrever uma string
vazia.
// E o último parâmetro é para colocar o
ícone da sua aplicação nos arquivos que
serão abertos por ela.
WriteString(”, Application.ExeName +
‘,0’);
CloseKey;
OpenKey(‘MeuPrograma\shell\open\command’,
True);
WriteString(”, Application.ExeName + ‘
“%1”’);
CloseKey;
RootKey := HKEY_CLASSES_ROOT;
OpenKey(‘.ext’, True); // Substitua o
“ext” pela extensão que você deseja
utilizar.
WriteString(”, ‘MeuPrograma’);
CloseKey;
end;
finally
Reg.CloseKey;
Reg.Free;
end;
End;
Acredito que você tenha conseguido aplicar esta
técnica que lhe pode ser bastante útil. Vamos então ver
a segunda dica, com ela você aprenderá como ler ou
escrever um valor no registro do windows:
Uses
Windows, Messages …. Registry; // Não
esqueça de adicionar a Unit Registry na
sessão uses…
OpenkeyReadOnly(‘SOFTWARE\MICROSOFT\WINDOW
S\CURRENTVERSION',false);
s:=readstring(‘version’);
closekey;
end;
edit.text:=s;
end;
Neste caso nós pegamos o registro “version”, que
significa a versão do windows, colocamos o seu valor na
variável “s” e depois à “jogamos” num “edit” qualquer,
apenas para que possamos visualizá-la.
Agora que você já sabe como escrever no registro do
windows, veremos o que precisamos escrever, para
colocar a nossa aplicação para ser inicializada junto com
o windows.
Uses
Windows, Messages …. Registry; // Não
esqueça de adicionar a Unit Registry na
sessão uses…
Openkey(‘\MICROSOFT\WINDOWS\CURRENTVERSION
\RUN’,false);
writestring(‘MeuPrograma’,
pchar(application.exename));
closekey;
end;
end;
Com mais essa dica, finalizo a nossa matéria que
ensina a trabalhar com o registro do windows. Espero
que você tenha gostado e que lhe seja bastante útil.
// ChangeNetDir
procedure ChangeNetDir(Drive: Char);
var
hCur: hDBICur;
Config: CFGDesc;
Cont: Boolean;
begin
if DbiInit(nil) = DBIERR_NONE then
begin
hCur := nil;
if DbiOpenCfgInfoList(nil, dbiREADWRITE,
cfgPersistent,
‘\DRIVERS\PARADOX\INIT’, hCur) =
DBIERR_NONE then
begin
if DbiSetToBegin(hCur) = DBIERR_NONE
then
begin
Cont := True;
while Cont do
begin
if (DbiGetNextRecord(hCur, dbiWRITELOCK,
@Config, nil)
<> DBIERR_NONE) then
Cont := False
else if StrIComp(Config.szNodeName, ‘NET
DIR’) = 0 then
begin
StrPCopy(Config.szValue, Drive + ‘:');
DbiModifyRecord(hCur, @Config, True);
Cont := False
end;
end;
end;
end;
DbiExit();
end;
end;
O uso deste procedimento pode ser assim:
procedure TForm1.Button1Click(Sender:
TObject);
begin
ChangeNetDir(‘H’);
end;
682 - Zerar Campo
AutoIncremento:
Quanto trabalhamos com tabelas Paradox e apagamos
o seus registros, o contador do campo AutoIncremento
não é zerado, criando muitas vezes um grande
inconveniente. Para resolver esse problema, use a
seguinte função:
function ResetAutoInc(FileName: TFileName;
Base: Longint): Boolean;
begin
with TFileStream.Create(FileName,
fmOpenReadWrite) do
Result := (Seek($49, soFromBeginning) =
$49) and (Write(Base, 4) = 4);
end;
O parâmetro FileName é o nome da tabela, incluindo o
caminho. E o parâmetro Base é o valor inicial para o
contador do AutoIncremento.
683 - Manipulando o Internet
Explorer
Neste artigo ensinarei como manipular o Internet
Explorer, e através de sua aplicação poder ordenar
comandos ao Browser mais utilizado no mundo.
Inicie o Delphi e crie uma nova aplicação,Insira no
formulário 4 Tbuttons. Coloque na propriedade caption
do Button1 “Iniciar” e no evento OnClick, insira o
seguinte código:
procedure TForm1.Button1Click(Sender:
TObject);
begin
IEApp :=
CreateOLEObject(‘InternetExplorer.Applicat
ion’);
IEApp.visible := true;
IEApp.Top := 0;
IEApp.Left := 0;
IEApp.width := screen.width;
IEApp.height := screen.height;
IEApp.Navigate(‘http://www.ClubeDelphi.com
.br’);
end;
Explicando o código: Tenho certeza de que você já
notou a facilidade do código. Ele cria uma aplicação do
tipo Internet Explorer, e atribui algumas propriedades.
Essas propriedades servem para informar que o
navegador deve estar visível, informar a posição onde
será criado o browser, o tamanho da tela e o endereço
que ele vai abrir.
Coloque na propriedade caption do Button2 “Voltar” e no
evento OnClick, insira o seguinte código:
procedure TForm1.Button2Click(Sender:
TObject);
begin
IEApp.GoBack;
end;
Explicando o Código: O Botão irá funcionar como o
próprio botão Voltar do Browser.
Coloque na propriedade caption do Button3 “Avançar” e
no evento OnClick, insira o seguinte código:
procedure TForm1.Button3Click(Sender:
TObject);
begin
IEApp.GoForward;
end;
Explicando o Código: O Botão irá funcionar como o
próprio botão Avançar do Browser.
Coloque na propriedade caption do Button4 “Fechar” e
no evento OnClick, insira o seguinte código:
procedure TForm1.Button2Click(Sender:
TObject);
begin
IEApp.Quit;
end;
Explicando o Código: Este botão irá fechar o browser.
Agora, insira a Unit Comobj na parte de uses lá em cima
no código, depois adicione a variável IEApp do tipo
Variant na parte de declaração de variáveis onde está
declarado o formulário:
var
Form1: TForm1;
IEApp: Variant;
implementation
{$R *.DFM}
Agora salve e execute a sua aplicação e comece a
controlar o nosso Internet Explorer.
Existem ainda alguns outros comandos que podem ser
usados, tais como:
IEApp.Refresh; - Serve para atualizar o browser.
IEApp.Stop; - Serve para parar o browser.
IEApp.GoHome; - Serve para ir para a página inicial,
que está configurada em seu browser.
IEApp.FullScreen := true; - Serve para exibir o browser,
sem nenhuma barra de ferramenta.
IEApp.StatusText; := ‘Qualquer texto’;
Feito Por: Marco Antônio
marco@ClubeDelphi.com.br
684 - Como posso saber a coluna
que estou posicionado no DBGrid?
É fácil saber a coluna que você está no DBGrid. Para
isso vamos usar a propriedade SelectedIndex que
retorna o número da coluna. Veja um exemplo:
procedure
Tform1.DBGrid1ColEnter(Sender:TObject);
begin
Edit1.Text :=
IntToStr(DBGrid1.SelectedIndex);
end;
685 - Transformar inteiro em
romanos
function RomanNumber(Value: Longint):
string;
Label
A500, A400, A100, A90, A50, A40, A10,
A9, A5, A4, A1;
begin
Result := ”;
while Value >= 1000 do begin
Dec(Value, 1000); Result := Result +
‘M’;
end;
if Value < 900 then goto A500
else begin
Dec(Value, 900); Result := Result +
‘CM’;
end;
goto A90;
A400:
if Value < 400 then goto A100
else begin
Dec(Value, 400); Result := Result +
‘CD’;
end;
goto A90;
A500:
if Value < 500 then goto A400
else begin
Dec(Value, 500); Result := Result + ‘D’;
end;
A100:
while Value >= 100 do begin
Dec(Value, 100); Result := Result + ‘C’;
end;
A90:
if Value < 90 then goto A50
else begin
Dec(Value, 90); Result := Result + ‘XC’;
end;
goto A9;
A40:
if Value < 40 then goto A10
else begin
Dec(Value, 40); Result := Result + ‘XL’;
end;
goto A9;
A50:
if Value < 50 then goto A40
else begin
Dec(Value, 50); Result := Result + ‘L’;
end;
A10:
while Value >= 10 do begin
Dec(Value, 10); Result := Result + ‘X’;
end;
A9:
if Value < 9 then goto A5
else begin
Result := Result + ‘IX’;
end;
Exit;
A4:
if Value < 4 then goto A1
else begin
Result := Result + ‘IV’;
end;
Exit;
A5:
if Value < 5 then goto A4
else begin
Dec(Value, 5); Result := Result + ‘V’;
end;
goto A1;
A1:
while Value >= 1 do begin
Dec(Value); Result := Result + ‘I’;
end;
end;
686 - Como tabular um ListBox
procedure TForm1.FormActivate(Sender:
TObject);
var
MatTabs : Array[0..5] of Integer;
begin
MatTabs[0] := 40;
MatTabs[1] := 80;
MatTabs[2] := 200;
MatTabs[3] := 400;
MatTabs[4] := 500;
MatTabs[5] := 700;
ListBox1.Perform(LB_SETTABSTOPS,1,Integer(
@MatTabs[0]));
end;
687 - Pesquisa incremental em uma
listbox
procedure TForm1.Edit1Change(Sender:
TObject);
begin
Listbox1.Perform(LB_SELECTSTRING,0,LongInt
(PChar(Edit1.Text)));
end;
688 - Eliminando os hints de uma
treeview
procedure TForm1.Button1Click(Sender:
TObject);
begin
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle,GWL_STYLE)
or $80);
end;
para mostrar os hints novamente
SetWindowLong(TreeView1.Handle, GWL_STYLE,
GetWindowLong(TreeView1.Handle,GWL_STYLE)
and not $80);
689 - Retorna o dia da semana em
formato string
Function DiadaSemana(Data : String) :
string;
const
semana : array[1..7] of string =
(‘Domingo’,‘Segunda-feira’,‘Terça-
feira’,‘Quarta-feira’,‘Quinta-
feira’,‘Sexta-feira’, ‘Sábado’);
begin
Result :=
semana[DayOfWeek(strtodate(Data))]
end;
690 - Pega o path de um arquivo
arrastado do explorer
uses
StdCtrls, ShellApi;
private
procedure WMDropFiles(var Msg :
TWMDropFiles); message WM_DROPFILES;
procedure TForm1.FormCreate(Sender:
TObject);
begin
DragAcceptFiles(Handle, True);
end;
DragQueryFile(Msg.Drop,i,PChar(NomeArq),25
5);
Listbox1.Items.Add(NomeArq);
end;
end;
691 - Como pegar a lista de
favoritos do Internet Explorer
function GetIEFavoritos(const favpath:
string):TStrings;
var
searchrec:TSearchrec;
str:TStrings;
path,dir,filename:String;
Buffer: array[0..2047] of Char;
found:Integer;
begin
str:=TStringList.Create;
//Pega todos os nomes de arquivo no path
dos favoritos
path:=FavPath+’\*.url’;
dir:=ExtractFilepath(path);
found:=FindFirst(path,faAnyFile,searchrec)
;
while found=0 do begin
SetString(filename, Buffer,
GetPrivateProfileString(‘InternetShortcut’
,
PChar(‘URL’), NIL, Buffer,
SizeOf(Buffer),
PChar(dir+searchrec.Name)));
str.Add(filename);
found:=FindNext(searchrec);
end;
found:=FindFirst(dir+’\*.*’,faAnyFile,sea
rchrec);
while found=0 do begin
if ((searchrec.Attr and faDirectory) >
0) and (searchrec.Name[1]<>’.’) then
str.AddStrings(GetIEFavourites(dir+’'+sear
chrec.name));
found:=FindNext(searchrec);
end;
FindClose(searchrec);
Result:=str;
end;
procedure TForm1.Button1Click(Sender:
TObject);
var pidl: PItemIDList;
FavPath: array[0..MAX_PATH] of char;
begin
SHGetSpecialFolderLocation(Handle,
CSIDL_FAVORITES, pidl);
SHGetPathFromIDList(pidl, favpath);
ListBox1.Items:= GetIEFavoritos
(StrPas(FavPath));
end;
692 - Como fechar um arquivo de
Help quando encerro minha
Aplicação
application.HelpCommand(help_quit, 0);
693 - Como mudar a cor de uma
regiao de Texto RichEdit
var
sStart: word;
begin
sStart := REdit.SelStart;
REdit.SelStart := 6;
REdit.SelLength := 10;
REdit.SelAttributes.color := clBlue; //
set color
REdit.SelAttributes.style :=
[fsUnderline]; // set attributes
Application.Processmessages;
REdit.SelStart := sStart;
REdit.SelLength := 0;
end;
694 - Como utilizar código de
barras no meu sistema
Para utilizar código de barras num sistema, existem
básicamente 03 tópicos:
1) Inclusão do código no seu banco
de dados:
O código de barras é um código como qualquer outro,
composto de números, e deve ser armazenado em seu
banco de dados num campo alfanumérico.
Existem vários tipos de código de barras, cada um com
seu algoritimo e tamanho. Os mais comuns - usados no
comercio - são o EAN8 e o EAN13, que como o próprio
nome já insinua têm 8 e 13 bytes cada um.
2)Leitura do código de barras:
Do ponto de vista do programa, existem 02 tipos de
leitura de código de barras: pela porta serial do micro e
pela interface do teclado.
A leitura feita pela interface do teclado (leitores
manuais) não requer nenhuma programação extra, pois
o código entra como se fosse digitado diretamente no
teclado.
A leitura feita pela porta serial já exige que você
implemente uma rotina de leitura da porta serial e deve
ser tratada internamente pelo programa, já que neste
caso nada vem pelo teclado.
3)Impressão do código de barras:
A maioria dos produtos hoje em dia já vêm com o
código de barras definidos e impressos pelo fabricante.
Para os casos em que o fabricante não,tenha um código
de barras definido, você pode e deve definir um código
interno e imprimi-lo.
Para a impressão do código, você pode desenvolver
sua própria rotina de impressão, usando o TPrinter, ou
usar algum componente pronto (nestes 02 casos, uma
impressora jato de tinta ou a laser resolvem), ou
comprar uma impressora específica para impressão de
código de barras.
Um bom livro sobre o assunto: Código de Barras - da
Teoria à Prática de Fábio Grossmann e Mauro Luiz
Zyngier.
695 - Como copiar tabelas Paradox
para Texto ou DBase e vice-versa
1) Inclua um TDATABASE no seu
Form e sete as seguintes
propriedades:
DatabaseName = ‘Temp’
DriverName = ‘STANDARD’
Params.Strings = ‘path=c:	este’ (ou qq outro path)
Connected = True
2) Inclua outro TTable em seu Form
e sete as seguintes propriedades:
DatabaseName = ‘Temp’
Name = ‘DESTINO’
TableType = ttASCII ou ttDbase ou ttParadox
TableName = o nome da nova tabela, sem extensão.
Ex: ‘Clientes’
IMPORTANTE: Não mexa na propriedade ACTIVE.
3) Inclua um TTable em seu Form,
contendo a tabela que você quer
copiar e mude a propriedade Name
para ORIGEM.
IMPORTANTE: Não mexa na propriedade ACTIVE.
4) Inclua um TBATCHMOVE em seu
Form e sete as seguintes
propriedades:
Destination = ‘DESTINO’
Mode = batCopy
Source = ‘ORIGEM’
5) Inclua um TBUTTON em seu
form e dê um duplo click no evento
OnClick.
6) Escreva o seguinte código na
procedure OnClick:
var
fn: FMTNumber;
begin
// O código a seguir verifica se o
separador de
// decimais é virgula e muda-o, para
evitar
// problemas de compatibilidade
Check(DbiGetNumberFormat(fn));
if fn.cDecimalSeparator = ‘,’ then
begin
fn.cDecimalSeparator := ‘.’;
fn.cThousandSeparator := ‘,’;
DbiSetNumberFormat(fn);
end;
// Aqui executamos a CÓPIA
BatchMove1.Execute;
end;
696 - Deletar um diretório inteiro
de uma vez
Problemas para deletar um diretório com subdiretórios?
Utilize a função abaixo:
Uses
Shellapi, filectrl, //declare estas das
units!!!
// Desabilita
procedure TForm1.Button2Click(Sender:
TObject);
var
Registry: TRegistry;
begin
Registry := TRegistry.Create;
Registry.RootKey := HKEY_CURRENT_USER;
Registry.OpenKey(‘\Control Panel\Desktop’,
TRUE);
Registry.WriteInteger(‘ScreenSaveUsePasswo
rd’,$1);
Registry.CloseKey;
Registry.Free;
end;
698 - Sobrescrevendo um evento
Para executar algo antes do evento Showmodal por
exemplo, utilize o seguinte:
public
function showmodal: integer;
procedure
TFormReindexar.Button1Click(Sender:
TObject);
var
dao: OLEVariant;
begin
try
Panel1.Caption:=‘Compactando Tabela’;
Panel1.Repaint;
dao := CreateOleObject(‘DAO.DBEngine.36’);
dao.CompactDatabase(extractfiledir(Applica
tion.ExeName)+’\banco.mdb’,
extractfiledir(Application.ExeName)+’\banc
o2.mdb’,”,0,’;pwd=1203583’);
Panel1.Caption:=‘Apagando Arquivo
Temporário’;
Panel1.Repaint;
if
FileExists(extractfiledir(Application.ExeN
ame)+’\banco2.mdb’) then
DeleteFile(extractfiledir(Application.ExeN
ame)+’\banco.mdb’);
Panel1.Caption:=‘Renomeando Arquivo’;
Panel1.Repaint;
if
FileExists(extractfiledir(Application.ExeN
ame)+’\banco2.mdb’) then
RenameFile(extractfiledir(Application.ExeN
ame)+’\banco2.mdb’,extractfiledir(Applicat
ion.ExeName)+’\banco.mdb’);
Panel1.Caption:=‘Arquivo Banco.mdb
Compactado’;
Panel1.Repaint;
except
panel1.caption:=‘Ocorreu um Erro durante a
compactação’;
end;
DataModule1.ADOConnection1.Connected:=true
;
end;
implementation
Uses Registry;
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);{Aqui vc vê qual a página
inicial}
begin
ShowMessage(GetIEStartPage);
end;
procedure TForm1.Button2Click(Sender:
TObject);{Aqui vc altera a página inicial}
begin
SetIEStartPage(‘www.napoles.hpg.com.br’);
end;
end.
Decimal
Romano
Binário
Hexadecimal
BCD e outros.
Valor Posicional
Como já vimos, em um sistema posicional um mesmo símbolo
pode assumir valores diferentes dependendo de sua posição.
Sendo assim, para sabermos o valor de qualquer número que
esteja escrito em um sistema posicional, precisamos conhecer o
valor posicional de cada símbolo. Isto é o que veremos a seguir.
Posição 2 1 0
Símbolos 3 4 5
37 2 18 1
18 2 9 0
9 2 4 1
4 2 2 0
2 2 1 0
1 2 0 1
Posição 5 4 3 2 1 0
Símbolo 1 0 0 1 0 1
Símbolo Valor
absoluto
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
A 10
B 11
C 12
D 13
E 14
F 15
Convertendo de Decimal para Hexadecimal
Sabendo-se que o sistema hexadecimal dispõe de 16 símbolos,
concluímos que sua base é 16. Aplicando a mesma técnica que
utilizamos na conversão de decimal para binário podemos
converter qualquer número decimal para hexadecimal
facilmente. Vejamos o exemplo da conversão do número
decimal 23870 para hexadecimal:
23870 16 1491 14
1491 16 93 3
93 16 5 13
5 16 0 5
Resto 5 13 3 14
Símbolo 5 D 3 E
Símbolo 5 C 3 F A
Valor absoluto 5 12 3 15 10
IntereSite - www.ulbrajp.com.br/~tecnobyte
Dicas, artigos, apostilas, componentes, exemplos e código-fonte
para Delphi.
706 - Construindo Threads com
Delphi
Hoje em dia, os programas de computador devem ser
cada vez mais rápidos de serem executados e que
possam realizar várias tarefas ao mesmo tempo, para
que o usuário possa realizar outras operações, ao
mesmo tempo que as executa.
Mas para que isso aconteça, nós desenvolvedores de
software devemos escrever nossos programas
baseados nesta tecnologia de muitas linhas de
execução, ou simplesmente “Threads”.
Um thread pode realizar vários operações residindo num
memso espaço de endereço na memória, quem
realmente controla esses threads é o sistema
operacional, que se baseia em suas prioridades. Essas
proridades são setadas por nós quando desenvolvemos
um thread. A boa nova, é que o Delphi é compatível com
esta tecnologia e fico triste quando vejo muitas pessoas
que ainda se empolgam muito pelo fato do Delphi ser
visual e fácil de usar, e esquecem de seu enorme
potencial.
Eu resolvi mostrar como se faz um thread, pois, é de
suma responsabilidade de um programador que uma
aplicação fique estável, e não devemos, num projeto
grande, nos basear somente na arquitetura de
Orientação a Objeto e IDE aprimorado do Delphi para
Desenvolver software.
Para se criar um thread em Delphi, devemos criar uma
classe que derive da classe “TThread”, que está escrita
na biblioteca “Classes”. A classe TThread é uma classe
abstrata, portanto não podemos utilizá-la diretamente,
pois devemos implementar um de seus métodos. Esse
método se chama “Execute”, ele é responsável por todo
o funcionamento do seu Thread. Junto com esse
método, temos o outro método “Synchronize” que serve
para acessar partes da VCL sem que percamos o
controle da aplicação, ou seja, o Windows ainda possa
controlar nossos objetos enviando mensagens para
eles. Esse método tem um único argumento que é do
tipo procedimento, ou seja, temos que definir
procedimentos em nossa classe que controlem a VCL, e
quando quisermos chamá-los, devemos passá-los como
argumento do método Synchronize. O nosso thread fará
o seguinte: Ele irá contar quantas linhas um arquivo
texto possui, e a cada linha que ele ler, irá incrementar
uma label que estará num form. A classe ficará assim:
type
TContador = class(TThread)
private
FNomeArq: string;
FNLinhas: Longint;
protected
procedure Execute; override; // Método
anulado
procedure IncLabel; virtual;
public
constructor Create(const Arquivo:
string);
end;
implementation
procedure TContador.Execute;
var
Arq: TextFile;
S: string;
begin
try
AssignFile(Arq, FNomeArq);
Reset(Arq);
while (not SeekEof(Arq)) do
begin
ReadLn(Arq, S);
FNLinhas := FNLinhas + 1;
Synchronize(IncLabel); // Aqui é chamado
o contador…
end;
finally
CloseFile(Arq);
end;
end;
procedure TContador.IncLabel;
begin
Form1.Label1.Caption :=
IntToStr(FNLinhas);
{ o Contador será executado em modo
protegido por uma Seção Critica do
Windows}
end;
constructor TContador.Create(const
Arquivo: string);
begin
inherited Create(True); { Chama o
contrutor herdado. Ele irá temporariamente
colocar o thread em estado de espera para
depois executá-lo. }
FNomeArq := Arquivo;
FreeOnTerminate := True; // Libera o
objeto após terminar.
Priority := TpLower; { Configura sua
prioridade na lista de processos do
Sistema operacional. }
Resume; // Inicia o Thread.
end;
var
Form1: TForm1; { <– Nome do meu
formulário }
vet_valido: array [0..35] of string =
(‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,
‘8’,‘9’,‘a’,‘b’,‘c’,‘d’,‘e’,‘f’,
‘g’,‘h’,‘i’,‘j’,‘k’,‘l’,‘m’,‘n’,
‘o’,‘p’,‘q’,‘r’,‘s’,‘t’,‘u’,‘v’,
‘w’,‘x’,‘y’,‘z’);
Depois de implementation {$R *.DFM} coloque a
seguinte função:
function func_VerifEmail(email: string):
boolean;
var
i, j, tam_email, simb_arroba,
simb_arroba2, qtd_arroba, qtd_pontos,
qtd_pontos_esq, qtd_pontos_dir, posicao,
posicao2, ponto, ponto2: integer;
vet_email: array [0..49] of string; //50
posições, capacidade do Edit
msg: string;
begin
{Por Jaci Jr em 12-10-2001 (00:28 às
03:57)
Contatos por
jrcordeiro@eletroacre.com.br ou
jrcordeiro@bol.com.br
Nesta função (func_VerifEmail) é
utilizada a função Copy, exemplo:
Copy(s,i,t) significa trecho de s que
começa em i com tamanho t}
qtd_pontos:= 0; qtd_pontos_esq:= 0;
qtd_pontos_dir:= 0; qtd_arroba:= 0;
posicao:=0; posicao2:=0; simb_arroba:=0;
simb_arroba2:=0; ponto:= 0;
ponto2:= 0; msg:=”;
Result:= True;
if ((vet_email[0] = ‘@’) or
(vet_email[0] = ‘.’) or (vet_email[0] =
‘-‘)) then
begin
Result:= False;
msg:= msg1;
end;
//Verificação final
if not Result then
begin
msg:= msg +#10+ ‘Formato de E-mail não
aceitável!!’;
MessageDlg(msg,mtWarning,[mbRetry],0);
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
Label1.Caption:= ”;
if Trim(Edit1.Text)<>” then
if (func_VerifEmail(Trim(Edit1.Text)))
then
begin
Label1.Caption:= Trim(Edit1.Text)+’ está
OK.’+#10+‘Formato aceitável.’;
Button1.Enabled:= False;
end
else
begin Button1.SetFocus; Edit1.SetFocus;
Edit1.SelText; end
end;
procedure TForm1.FormKeyPress(Sender:
TObject; var Key: Char);
begin
if Key = #13 then Button1Click(Sender);
if (not ((Key in [‘0’..‘9’]) or (Key in
[‘A’..‘Z’]) or
(Key in [‘a’..‘z’]) or (Key = ‘@’) or
(Key = ‘.’) or (Key = ‘-‘))) then
Key:= #0;
end;
procedure TForm1.Edit1Change(Sender:
TObject);
begin
Label1.Caption:= ”;
Button1.Enabled:= True;
end;
//Ligue os eventos corretamente e verifique o resultado
procedure TForm1.Button1Click(Sender:
TObject);
var
Coluna, Linha: integer;
begin
MouseCell(StringGrid1, Coluna, Linha);
if (Coluna >= 0) and (Linha >= 0) then
Caption := ‘Coluna: ‘ + IntToStr(Coluna)
+ ‘ - ‘ +
‘Linha: ‘ + IntToStr(Linha);
else
Caption := ‘O mouse não está no
StringGrid’;
end;
{Dica enviada por Marco Barki Algranti}
711 - Fechando todas as tabelas de
um aplicativo
var
i: integer;
begin
with Session do
for i:= 0 to DatabaseCount - 1 do
Databases[I].Close;
end;
{Dica enviada por Marco Barki Algranti}
712 - Retorna quantos dias tem um
referido mes do ano
function DiasNoMes(AYear, AMonth:
Integer): Integer;
const
DaysInMonth: array[1..12] of Integer =
(31, 28, 31, 30, 31, 30, 31, 31, 30, 31,
30, 31);
begin
if AMonth = 2 then
begin
if Ayear mod 4 = 0 then
begin
Inc(DaysInMonth[AMonth]);
end;
end;
Result := DaysInMonth[AMonth];
end;
{Dica enviada por Marco Barki Algranti}
713 - Retorna a diferenca de dias
entre duas datas
function DifDias(DataVenc:TDateTime;
DataAtual:TDateTime): String;
Var Data: TDateTime;
dia, mes, ano: Word;
begin
if DataAtual < DataVenc then
begin
Result := ‘A data data atual não pode ser
menor que a data inicial’;
end
else
begin
Data := DataAtual - DataVenc;
DecodeDate( Data, ano, mes, dia);
Result := FloatToStr(Data)+’ Dias’;
end;
end;
{Dica enviada por Marco Barki Algranti}
714 - Converte um certo número de
segundos em horas já formatado
function FormatSecsToHMS(Secs: LongInt):
string;
var
Hrs, Min: Word;
begin
Hrs := Secs div 3600;
Secs := Secs mod 3600;
Min := Secs div 60;
Secs := Secs mod 60;
Result := Format(‘%d:%d:%d’, [Hrs, Min,
Secs]);
end;
{Dica enviada por Marco Barki Algranti}
715 - Como colocar um componente
ComboBox em um componente
StringGrid
//Inclua no seu Form um componente
ComboBox e um componente StringGrid.
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
ComboBox1: TComboBox;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Procedure AcertaAutoInc(NomeAlias :
String);
Var ParamAlias, AliasTab: Tstrings;
contador, I : integer;
VlrAutoInc,VLRregAutInc : Longint;
AutoIncOK, EAutoInc : Boolean;
Tabela: TTable;
arqteste, CampoAutoInc, PathAlias:
String;
begin
EAutoInc := false;
ParamAlias := TStringList.create;
AliasTab := TStringList.create;
Session.GetTableNames(NomeAlias,’*.db’,tru
e, true, AliasTab);
contador := 0;
Session.GetAliasParams(NomeAlias,ParamAlia
s);
PathAlias := ParamAlias.Values[ ‘PATH’
];
if copy(PathAlias,length(PathAlias),1) =
‘' then
PathAlias :=
copy(PathAlias,1,length(PathAlias)-1);
while contador <> AliasTab.Count do
begin
with TFileStream.Create( PathAlias
+’'+AliasTab.Strings[contador],
fmOpenReadWrite) do
begin
AutoIncOK := (Seek($49, soFromBeginning)
= $49) and (Read(VlrAutoInc, 4) = 4);
free;
end;
if AutoIncOK then
begin
with TTable.Create(Application) do
try
DatabaseName := NomeAlias;
TableName := AliasTab.Strings[contador];
with FieldDefs do
begin
Update;
for I := 0 to Count -1 do
begin
if Items[i].DataType = ftAutoInc then
begin
CampoAutoInc := (Items[I].Name);
EAutoInc := true;
end;
end;
end;
finally
Free;
end;
end
else
begin
Application.MessageBox(‘Erro na
recuperação do campo Auto-
Incremento.’,‘Atenção’,MB_OK);
Exit;
end;
if EAutoInc then
begin
Tabela := TTable.create(Application);
Tabela.DatabaseName := NomeAlias;
Tabela.TableName :=
AliasTab.Strings[Contador];
Tabela.open;
if Tabela.RecordCount > 0 then
begin
Tabela.Last;
VLRregAutInc :=
Tabela.FieldByName(CampoAutoInc).Value;
end;
Tabela.close;
if VlrAutoInc < VLRregAutInc then
begin
with TFileStream.Create(PathAlias +’'+
AliasTab.Strings[contador],
fmOpenReadWrite) do
begin
AutoIncOK := (Seek($49, soFromBeginning)
= $49) and (Write(VLRregAutInc , 4) = 4);
free;
end;
end;
if AutoIncOK = false then
Application.MessageBox(‘Erro na
recuperação do campo Auto-
Incremento.’,‘Atenção’,MB_OK);
end;
EAutoInc := false;
contador := contador + 1;
end;
ParamAlias.Free;
AliasTab.Free;
end;
{Dica enviada por:Jasoni Corrêa}
719 - Label escrita letra a letra
Tenho uma dica aqui que até é legalzinha…
Ela digita letra por letra…
com certeza pode ser melhorado, mas é só uma dica..
Será utilizado: Um TLabel e um TTimer, sendo que o
Caption do Tlabel já esteja definido antes de dar o
Create do Form..
public
LetraNum:Integer;
Frase:String;
if i=length(valor) then
begin
result:=copy(valor,anterior+1,i-
anterior);
exit;
end;
if index=1 then
begin
result:=copy(valor,0,pos(caracter,valor)-1
);
exit;
end;
end;
end;
exemplo:
splitstr(‘aaa\bbb\ccc\ddd’,’',3)=ccc
{Dica enviada por Tberg}
721 - Função que arredonda valores
Excelente função para arrendondamento de valores.
Alias, a única que funciona.
function Arredondar(Valor: Double; Dec:
Integer): Double;
var
Valor1,
Numero1,
Numero2,
Numero3: Double;
begin
Valor1:=Exp(Ln(10) * (Dec + 1));
Numero1:=Int(Valor * Valor1);
Numero2:=(Numero1 / 10);
Numero3:=Round(Numero2);
Result:=(Numero3 / (Exp(Ln(10) * Dec)));
end;
end;
{Dica enviada por Wendel Machado}
723 - Pesquisa de um string
mudando o texto
Coloque no OnChange do Edit1 o Código
Abaixo
var
i : integer;
aux: integer;
begin
aux:=1;
for i:=0 to Length(RichEdit1.Text) do
begin
if
(Copy(RichEdit1.Text,i+1,length(Edit1.Text
)) =
Edit1.Text) then
begin
RichEdit1.SelStart := aux;
RichEdit1.SelLength := i-aux+1;
RichEdit1.SelAttributes.Color := ClBlack;
RichEdit1.SelAttributes.Style := [];
RichEdit1.SelStart := i;
RichEdit1.SelLength := Length(Edit1.text);
RichEdit1.SelAttributes.Color := ClRed;
RichEdit1.SelAttributes.Style := [fsBold];
aux := i + length(Edit1.Text);
end;
end;
RichEdit1.SelStart := aux;
RichEdit1.SelLength := i-aux+1;
RichEdit1.SelAttributes.Color := ClBlack;
RichEdit1.SelAttributes.Style := [];
end;
SELECT *
FROM DEPARTMENT D
WHERE EXISTS
(SELECT *
FROM EMPLOYEE E
WHERE E.EMP_NO = D.MNGR_NO
AND E.JOB_COUNTRY = ‘England’)
SELECT D.*
FROM DEPARTMENT D JOIN EMPLOYEE E ON
D.MNGR_NO = E.EMP_NO
WHERE E.JOB_COUNTRY = ‘England’
Atribuir os indíces
Combinar os indíces
Determinar a ordem do JOIN
Gerar os “rivers”
Estimativa de custo
Ordernar os “merges”
NetBEUI e IPX/SPX
Os protocolos NetBEUI e IPX/SPX são designados para
serem utilizados em pequenas redes. Esse protocolos são
normalmente utilizados para serviços de compartilhamento
de arquivos. Esse protocolos enviam pacotes para toda a
rede, aumentado o nível de “ruído” em uma LAN. O “ruído”,
do ponto de vista de qualquer terminal, pode ser definido
com um tráfego de dados que não é designado para esse
terminal. Em uma LAN com muitos terminais, usar os
protocolos NETBEUI ou IPX/SPX pode afogar a rede e
reduzir a banda livre para tráfego de dados. O uso desses
protocolos é desencorajado.
TCP/IP
TCP/IP é um protocolo baseado em conexão, significando
que os pacotes de dados são direcionados para um
determinado terminal, reduzindo o tráfego da rede e nos
terminais, disponibilizando muito mais banda livre, fazendo
com que a performance não se degrade.
DNS
Cada terminal em uma rede TCP/IP tem designado um
número IP que é utilizado para o direcionamento dos dados.
O TCP/IP requer um meio para que os clientes traduzam os
nomes dos terminais para seus respectivos números IP.
Isso é feito em cada cliente, através do arquivos
HOSTS/LMHOSTS, ou utilizando um servidor central
chamado DNS. O DNS recebe o nome do host e devolve o
número IP do mesmo para que o cliente se comunique
diretamente com o terminal desejado.
Dependendo do volume de dados e da carga do servidor
DNS, o processo de tradução de um nome para o IP pode
levar alguns segundos, significando uma demora nas
conexões da rede.
Então como posso aumentar a velocidade para a resolução
dos nomes ? Ao invés de utilizar um DNS, use o arquivo
HOSTS em cada terminal para determinar resolver os IPs.
Procurar por uma linha dentro de um arquivo local é muito
mais rápido do que esperar a resolução de um DNS remoto.
DHCP
Uma desvantagem do TCP/IP sobre os outros protocolos é
que ele é mais díficil de ser gerenciado do que o NetBEUI
ou o IPX/SPX. Todos os terminais de uma rede TCP/IP
devem ter designados um único número IP. Isso acaba
sendo uma árdua tarefa de configuração e administração.
O DHCP (Dynamic Host Configuration Protocol) pode
facilitar essa tarefa. A estação pergunta ao servidor DHCP e
o mesmo retorna um número de IP livre que pode ser
utilizado pela estação. A estação usa esse IP pela duração
da sua sessão na rede.
Configuração das páginas do BD
Índices Direcionais
Os índices podem ser definidos como ascendentes e
descendentes (ASCENDING ou DESCENDING). Para
ordenar em ambas as direções, voce precisa de um índice
de cada tipo. Isso é muito importante de voce costuma
utilizar DBGrids no Delphi.
Ajustando os índices
A seletividade de um índice é o indicador da sua
exclusividade. O optimizador usa a seletividade no seu
algoritmo para decidir se deve ou não utilizar um índice
dentro de um PLANo em uma query. Se a seletividade está
atrasada e não representa adequadamente o estado de um
índice, o optimizador podera usar ou não o índice de
maneira inadequada. Isso geralmente não provoca uma
perda de performance, a não ser que a seletividade esteja
muito desatualizada. Para recalcular a seletividade de um
índice use :
SET STATISTICS name;
Periodicamente, a estrutura da árqvore B-tree pode se
tornar desbalanceada, ou pode conter valores na árvore
que não existem mais no BD (isso não deve acontecer no
IB 5.0 ou superior devido ao recurso de Index Garbage
Collection). Voce deve periodicamente re-construir um
índice :
ALTER INDEX name INACTIVE;
ALTER INDEX name ACTIVE;
Cache do Banco de Dados
O processo IBSERVE.EXE rodando no servidor mantém um
cache na memória com os dados e as páginas de índices
utilizados recentemente. Como qualquer cache, o ganho de
performance depende da repetição dos acessos aos
mesmos dados. Nas versões SuperServer do IB (IB 4.2 e
superiores), o cache é compartilhado com todos os clientes
conectados ao BD.
Por default, o IB aloca memória suficiente para armazenar
256 páginas do BD. Se o tamanho da página está definido
em 1K, então 256K de memória será usada pelo cache. Se
o tamanho da página é de 4K, então 1MB de memória será
usada. A API do Interbase possibilita uma maneira de
qualquer cliente pedir ao servidor que o tamanho do cache
seja aumentado. A partir do IB 5.0, voce pode setar uma
propriedade em cada BD que especifique o tamanho do
cache que deve ser usado quando houver uma conexão ao
BD.
GFIX.EXE -BUFFERS 5000 DATABASE.GDB
O valor padrão de 256 foi utilizado para máquinas com
pouquissíma memória, impedindo que o IB consumisse
muita memória no sistema. Aumentar o tamanho do cache é
benéfico para a performance. Nos servidores de hoje, onde
há grande quantidade de memória disponível, é altamente
recomendável que se aumente o tamanho do cache.
Não aumente o tamanho do cache em um valor muito alto,
que faça com que o IBSERVER.EXE tenha que utilizar a
memória virtual (SWAP) do servidor. Isso estaria anulando
totalmente a vantagem de se usar um cache visto que o
acesso ao disco (SWAP) é muito mais lento do que o
acesso à memória.
Não aumente o tamanho do cache para um valor mais alto
do que o número de páginas do BD (voce pode ver o
número das páginas através do Server Manager na opção
Database Statistics ou através do utilitário GSTAT.EXE).
Qualquer página do disco ocupa apenas 1 página no cache
e nunca é duplicada.
Um bloco de memória é alocado para cada cache por cada
BD. Se um cliente se conecta à 2 BD diferentes no mesmo
servidor, o processo IBSERVER.EXE manterá 2 áreas de
memória separadas para cada cache.
Voce deve experimentar os valores do cache e analizar o
ganho de performance para cada caso. Voce pode ganhar
até 30% de performance com isso.
Bufferização de I/O
O IB em plataformas Windows-Intel implementa um cache
de gravação do tipo write-through como padrão. Cada
operação de escrita no cache é imediatamente passada
para o Sistema Operacional (que pode utilizar um cache de
gravação ou não).
Em contraste, o modo de cache write-back armazena e
atrasa a gravação dos dados para depois. Múltiplas
operações de escrita para uma página do cache são
executadas na memória para depois serem gravadas no
disco, resultando em um melhor tempo de resposta para a
maioria das operações de escrita. O modo write write back
é muito mais eficiente do que o modo write-through.
O Interbase utiliza o modo write-back como default nas
versões em UNIX, mas não na versão Wintel. O modo write-
back pode ser configurado manualmente através do
comando GFIX.EXE -WRITE ASYNC ou desativando a
opção “Enable Forced Writes” na página “Database
Properties” no Server Manager.
O benefício de se usar escrita assíncrona (write-back) é de
mais ou menos 4 vezes mais performance, apesar de
alguns usuarios reportarem um ganho de até 20x em
aplicações que executam muitas operações de escrita
(INSERT, UPDATE, DELETE).
O problema do write-back é que dados podem ser perdidos
no caso do servidor sofrer uma queda de energia, ou se o
IBSERVER.EXE travar ou for finalizado de maneira
anormal. Isso não ocorre se o modo escolhido é o write-
through. Se voce testou e verificou que o servidor não está
suscetível à esses problemas, então é recomendável que
voce utilize o modo write-back.
Servidor Ativo
O Interbase oferece metadata ativa para permitir que o
servidor de banco de dados seja centralizado :
Triggers
Stored Procedures
SELECT Procedures
Integridade Referencial em cascata (PRIMARY KEY e
FOREIGN KEY)
Privilégios de SQL
Funções definidas pelo usuário
Exceções definidas pelo usuário
Eventos
Veja http://www.interbase.com/tech/docs/trig_sp.html
http://www.interbase.com/tech/docs/udfs.html para mais
informações.
Configuração da BDE
Mude os padrões da BDE através do BDE Administrator.
Driver flags
O valor recomendável para a opção DRIVER FLAGS é de
4608.
Setando 512 ao valor do DRIVER FLAGS na BDE, voce
estará especificando que o modo de isolamento
transacional utilizado será o “repeatable read”, reduzindo
assim o overhead que o modo de transações automáticas
ocasiona. (veja #7: Transações).
Utilizando o valor 4096 na opção DRIVER FLAGS, voce
estará setando a BDE para utilizar o modo “soft commit”.
Soft commits é um recurso do IB que permite o driver reter
o cursor enquanto está executando as alterações. Soft
commits aumenta a performance nas atualizações de
grandes volumes de dados. Quando se usa hard commits, a
BDE deve reler todos os registros de um dataset, mesmo
após a mudança de um único registro. Isso não é tão
problemático quando se está usando um banco de dados
desktop, pois os dados são transferidos no centro de
memória. Para um banco de dados C/S (como o InterBase),
atualizar um dataset consome muita banda da rede e
degrada a performance radicalmente. No modo soft commit,
o cursor é mantido e não ocorre a re-leitura dos dados
(refetch).
TDatabase.StartTransaction
TDatabase.Commit
TQuery
CachedUpdates = False
Permite ao servidor gerenciar as atualizações,
deletações e conflitos
RequestLive = False
Há relatos de usuários do Delphi que setando essa
opção para false previne que o VCL mantenha
uma cópia dos dados no cliente, diminuindo o
tráfego na rede.
TTable
A TTable é designada para o uso em tabelas de médio
tamanho em base de dados locais. A TTable lê informações
da metadata de uma tabela, e tenta manter um cache dos
dados do dataset na memória. Essa cópia dos dados é
atualizada quando voce executa um POST ou um
ROLLBACK. Isso implica em uma grande sobrecarga na
rede para a maioria dos banco de dados C/S, que tem
tabelas muito maiores e que geralmente são acessados por
toda a rede. Voce pode observar a atividade de uma
TTABLE através do SQL monitor, que lhe mostrará todas as
chamadas da TTABLE feitas para a BDE e para a API do
Interbase.
Não use TTable para C/S, use
TQuery
Apesar da TTable ser muito conveniente por suas
características RAD e seu modelo abstrato, ela deve ser
evitada com o Interbase. A TTable não foi designada para
ser utilizada em aplicações client/server.
Free IB Components
Informações adicionais
Screen savers
Não utilize Screen Savers (Protetores de tela) no servidor !
Pode parecer que não mas eles consomem processamento
e podem fazer grande diferença na performance do seu
servidor, principalmente os baseados em Open GL ! Se
voce for utilizar um screen saver, opte por aqueles que
simplesmente deixam a tela preta ou colocam o monitor em
stand-by.
Console logins
Não deixe o servidor logado em uma máquina Windows NT.
Mesmo quando o desktop está em idle, ele pode estar
utilizando até 30% do processamento só para manter a
interface. Basicamente todas as tarefas relativas a
manutenção do BD podem ser realizadas em qualquer
estação de trabalho.
Fast I/O
Utilize um HD rápido. Algumas considerações:
Servidor Dedicado
Utilize sempre um servidor dedicado. Use máquinas
separadas para servidor de impressão e arquivos.
Optimização do Windows NT
Jung Vu (jungv@knowledgeweb.com) escreveu:
Multiprocessadores
Muitos usuários tem reportado apenas um modesto ganho
de performance com o uso do IB em sistemas com multiplos
processadores. Apesar do IB ser certificado para funcionar
com SMP, sua versão atual não implementa características
de execução paralela (que está planejada para uma futura
versão).
O gerenciador de locks do IB não está condificado em multi-
tarefa, portanto os acessos aos dados tendem à ser
serializados. Isso geralmente não é um fator limitante de
performance, pois o gerenciamento de locks é uma
operação de alto rendimento se comparado à I/O física.
Sistemas SMP podem trazer benefícios ao IB pensando que
as CPUs adicionais podem se ocupar com outros serviços
do servidor, como serviços de rede, desktop e outros
processos. O tamanho do ganho de performance nesses
casos depende da demanda de outros processos
relacionados ao processo servidor IB. Baseado nos
relatórios de alguns clientes, esse ganho é de 5% a 20%.
Por outro lado, nosso suporte técnico prefere dizer que o
SMP atualmente contribui para degradar a performance do
IB quando utilizado no Windows NT.
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Recomendação para
DESENVOLVIMENTO:
Code Generation
Optimization - OFF
Aligned record fields - ON
Stack frames - ON
Pentium-safe DIV - OFF
Sintaxe Options
Strict var-strings - ON
Complete boolean eval - OFF
Extended syntax - ON
Typed @ operator - ON
Open parameters - ON
Huge strings - ON
Assignable typed constants - OFF
Runtime errors
Range checking - ON
I/O checking - ON
Overflow checking (Q) - ON
Debug
Debug information - ON
Local symbols - ON
Reference info (Y) - ON
Definitions only - ON
Assertions (C) - ON
Use Debug DCUs - ON
Messages
Show hints - ON
Show warnings - ON
Recomendação para
DISTRIBUIÇÃO:
Code Generation
Optimization - ON
Aligned record fields - ON
Stack frames - OFF
Pentium-safe DIV - OFF
Sintaxe Options
Strict var-strings - ON
Complete boolean eval - OFF
Extended syntax - ON
Typed @ operator - ON
Open parameters - ON
Huge strings - ON
Assignable typed constants - OFF
Runtime errors
Range checking - OFF
I/O checking - ON
Overflow checking (Q) - OFF
Debug
Debug information - OFF
Local symbols - OFF
Reference info (Y) - OFF
Definitions only - OFF
Assertions (C) - OFF
Use Debug DCUs - OFF
Messages
Show hints - ON
Show warnings - ON
730 - Melhorando a aparência do
seu Hint
Resumo:
Se vc tiver a Biblioteca de Componentes RxLib , vc pode
usar a Unit RxHints p/ Melhorar a aparência do seu Hint
mudando a Formação p/ Balão, Retangulo … e p/
melhorar mias formatando a cor de fundo , sustentando
por mais tempo e com mais de uma linha.
Texto:
Abaixo um exemplo de implementação:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms,
Dialogs, StdCtrls, RxHints ;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender:
TObject);
begin
// —> Formação do Hints
RxHints.SetHintStyle(hsEllipse, 5, true,
taLeftJustify ); // Forma de Balão
Application.HintColor := $005BFFAD ; //
muda a cor de fundo
Application.HintHidePause := 100000 ; //
Sustenta o Hint em quase 2min
end;
end.
731 - Criando e Distribuindo
Aplicações Shareware
Shareware oferece a possibilidade de compartilhar seus projetos
pessoais com o resto do mundo e o potencial por fazer um pouco
dinheiro vivo no processo. Neste artigo, Clay Shannon mostra como
você pode maximizar as vendas de suas aplicações shareware incluindo
um processo de registro fácil para implementar e fazendo sua aplicação
prontamente acessível para clientes potenciais.
Descrição:
Criando e Distribuindo Aplicações Shareware
Clay Shannon
www.guiadodelphi.com.br
Traduzido por: Marcos Ribeiro
16/12/2001
Shareware oferece a possibilidade de compartilhar seus projetos
pessoais com o resto do mundo e o potencial por fazer um pouco
dinheiro vivo no processo. Neste artigo, Clay Shannon mostra como
você pode maximizar as vendas de suas aplicações shareware incluindo
um processo de registro fácil para implementar e fazendo sua aplicação
prontamente acessível para clientes potenciais.
Se você é desenvolver de uma corporação, consultor, estudante, ou
hobista, produzir aplicações shareware pode ser de benefício para você.
Além dos benefícios monetários óbvios, escrevendo shareware podem o
ajudar também para:
• Expandir suas habilidades de codificação, se o shareware que você
escreve para pedras de amolar, aumenta a sua habilidade atual ou o
leva em regiões do universo da programação que você não explorou
previamente.
• Mantém seu interesse vivo na programação (acontece de você estar
trabalhando em um menor que rebitado projeto de trabalho).
• Provê um meio para ganhar experiência do mundo real em novas
metodologias e disciplinas de programação.
Como você pode ver, há muitas razões boas para estar trabalhado em ”
projetos “, aparte do que você faz no trabalho ou escola. De fato, se a
atração monetária não faz sentido ou até mesmo é repugnante para
você, freeware pode ser o modo para você faze-lo.
A ferramenta certa para o
trabalho
Quando Delphi inicio sobre a cena da programação, era muito elogiado
como oferecendo ” a facilidade do VB e o poder do C “. Isso não era
marketing. Embora não apresentando um ambiente de programação
completo podia ser descrito como “fácil” quando comparado ao C e C++
que VB e Delphi. Até onde poder está preocupado, você pode criar
qualquer tipo de software que você pode imaginar com o Delphi.
Até onde estão preocupados com ferramentas de programação, Delphi
é sem dúvida a melhor escolha para criar aplicações shareware. Para a
maioria dos projetos, você não precisará do Delphi Enterprise. Porém,
se você está usando a edição Personal do Delphi, você não poderá criar
aplicações comerciais. Em outras palavras, você não pode cobrar
dinheiro por aplicações que você cria com a edição Personal.
A melhor ratoeira
Se as pessoas vão carregar, tentam, e continuam usando seu programa,
deve ser útil, diversão para usar, ou (preferentemente) uma combinação
dos dois.
Se você cria um editor de texto, por exemplo, precisa ser melhor que os
usuários já adquirem com Windows (Notepad). Caso contrário, por que
eles trocariam? Mais para o ponto, por que eles o pagariam uma
utilidade que eles já possuem? Se sua aplicação é um editor de texto,
planilha eletrônica, ferramenta de administração de banco de dados, ou
qualquer outra coisa, deve ser melhor que o que já está prontamente
disponível ao usuário. Isto não é dizer que tem que emparelhar
característica-para-característica de produtos de rival. Como um homem
sábio uma vez disse, ” Menos é mais “. por exemplo, muitas pessoas
poderiam preferir um processador de texto com menos características
que o ” tudo mais a pia da cozinha ” que os processadores de texto
principais ostentam, se a versão “lite ” estivesse mais amigável ao
usuário, menos bug, e menos caro.
Outro, talvez até mesmo uma opção mais desafiadora é criar um tipo
único de aplicação. O truque aqui é este: Se o tipo de aplicação que
você tem em mente ainda não foi criado, realmente há um mercado para
ele? Talvez assim, mas é possível que um programa semelhante exista
e simplesmente não foi aceito na feira. Antes invista dúzias, centenas,
ou milhares de horas em seu software magnum opus, faça alguma
pesquisa para ver se uma aplicação semelhante já existe. Você pode
construir uma significativamente melhor? Nesse caso, então vá em
frente! Se não (vou ser honesto com você), trabalhe em outra idéia.
Não doe a loja
O que é aquela expressão velha sobre leite livre e uma vaca? Usuários
de sua aplicação shareware podem não ser deliberadamente
desonestos ou baratos quando eles não registram (e pagam) a cópia
deles da sua aplicação. Muito pode ser esquecimento ou procrastinação
prolongado por parte de usuários que estão agüentando do modo de
sua remuneração receptora de seu trabalho duro. Em um nível pessoal,
tenho que admitir que eu usei o PKZip durante anos antes de eu
finalmente paga por ele. Isto não era mesquinhez minha, mas bastante
procrastinação extraordinária.
Você não tem que se sentar passivamente atrás e esperar que os
usuários farão a coisa certa, entretanto, eventualmente. Você pode fazer
algo que encorajará que os usuários registrem a cópia deles do seu
software: Só “Interdite” uma característica importante aos usuários
registrados. Tenha cuidado para você não impedir aos clientes
potenciais de ver as características principais de sua aplicação. Senão,
isso os frustrará e provocará uma viagem rápida para Iniciar |
Configurações | Painel Controle | Adicionar ou Remove Programas.
Uma boa escolha para lacrar uma característica seria algo que não é
absolutamente essencial, mas sem o qual software é menos precioso.
Exemplos disso é imprimir funcionalidades em algumas aplicações ou,
no caso de aplicações de banco de dados, habilita para adicionar um
novo registro ou modificar registros existentes.
Um fácil esquema para bloquea
algumas características
Alguns registros shareware são implantados suas próprias chaves de
registro em um Web sites. Aqui, entretanto, eu lhe mostrarei um modo
fácil para programar a desaprovação aos usuários não registrados de ter
acesso as características específicas de sua aplicação, junto com um
modo fácil para estas características ser “destravado ” quando eles
pagam seu software.
Em um nutshell, você escreve o código para conferir a existência de um
arquivo que você enviará aos usuários registrados. Preferentemente,
este arquivo será enviado por e-mail, mas quando necessário (o usuário
não possui um endereço de e-mail), você também pode enviar este por
disquete. Quando o arquivo é encontrado, uma string codificada é lida
dele, claro que, decifrado. Se ele combinar com o que você tem em seu
código fonte, pode ser assumido que é um arquivo genuíno, e é feita a
funcionalidade que só está disponível aos usuários registrados. Este
esquema não trancará para determinados hackers, claro que, mas
deveria ser mais que suficiente desencorajar o usuário comum de tentar
usar as características avançadas de seu programa sem pagar por ele.
Como um exemplo, se você está usando um componente DBGrid junto
com PrintDat! de GreBarSys (como eu tenho em meu programa
shareware EZ DB, disponível no CodeCentral em
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=16306),
você pode usar o código semelhante ao seguinte:
{–––––––––––––––––-}
procedure
TWhatever.btnPrintClick(Sender:
TObject);
begin
if RegisteredCopy then
DBGridPrintJob1.Print
else
MessageDlg(SAdvantagesOfRegistering,mtIn
formation, [mbOK], 0)
end;
{–––––––––––––––––-}
{ The user must have a “genuine” copy of
the file
EZDB.RegVal in the same dir as the .exe
(genuine
= it contains the encrypted password).
sRegVal and
MAGIC_NUMBER are in EZDBGlobals. }
function RegisteredCopy: Boolean;
function RegFileContainsCorrectValue:
Boolean;
var
sl: TStrings;
sDecryptedRegVal: String;
i: Integer;
begin
sl := TStringList.Create;
try
sl.LoadFromFile(SEZDBReg);
{ Just to be on the “safe side”,remove
empty items }
for i := Pred(sl.Count) downto 0 do
if Trim(sl[i]) = ” then
sl.Delete(i);
sDecryptedRegVal :=
Decrypt(Trim(sl[0]),MAGIC_NUMBER);
Result :=
AnsiSameText(sDecryptedRegVal, sRegVal);
finally
sl.Free;
end;
end;
begin
Result := FileExists(SEZDBReg) and
RegFileContainsCorrectValue
end;
{–––––––––––––––––-}
{ Adapted from strDecrypt from the
freeware unit
XProcs by Stefan Boethe }
function Decrypt(const S: String; Key:
Int64): String;
var
I: Integer;
begin
{$IFDEF Win32}
SetLength(Result,Length(S));
{$ELSE}
Result[0]:=Chr(Length(S));
{$ENDIF}
for I := 1 to Length(S) do
begin
Result[I] := char(Ord(S[I]) xor (Key
shr 8));
Key := (Ord(S[I]) + Key) * C1 + C2;
end; //for I := 1 to Length(S) do
end;
Claro que para gerar o valor correto para o arquivo
que você enviará aos usuários registrados, você
primeiro tem que codificar a string encriptada que
você conferirá. Isto é feito usando Decrypt função irmã
de Encrypt:
{–––––––––––––––––-}
{ Adapted from strEncrypt from the
freeware unit
XProcs by Stefan Boethe }
function Encrypt(const S: String; Key:
Int64): String;
var
I: Integer;
begin
{$IFDEF Win32}
SetLength(Result,Length(S));
{$ELSE}
Result[0]:=Chr(Length(S));
{$ENDIF}
for I := 1 to Length(S) do
begin
Result[I] := Char(Ord(S[I]) xor (Key
shr 8));
Key := (Ord(Result[I]) + Key) * C1 +
C2;
end; // for I := 1 to Length(S) do
end;
Para elucidar o código do procedimento, aqui está
alguns valores pertinentes do projeto da unidade
Globals que ajuda implementar a funcionalidade de
lock/unlock:
{ Encryption values (C1 and C2) adapted
from the
freeware unit XProcs by Stefan Boethe. }
SEZDBReg = ‘EZDB.RegVal’;
sRegVal =
‘SportsDefinition_RunJumpSweatAndSmashIn
toThings’;
MAGIC_NUMBER = 1958;
C1 = 52845;
C2 = 22719;
Você é seu host
Não é bastante para terminar a codificação de sua aplicação
simplesmente. Uma vez completo, você tem que fazer isto disponível
para seu publico, quer dizer, clientes potenciais.
Uploading de software é uma atividade que a Web alterou
drasticamente. Anos atrás, você podia fazer upload de suas aplicações
para serviços on-line múltiplos e boletim que hospedariam as aplicações
fisicamente para você. Com o advento de “nada mais que a Net”,
entretanto, a maioria dos sites shareware agora esperam que você
possa hospedar seus programas por conta própria em seus sites e lhes
dar um link para seu arquivo. Uma exceção para isto é Winsite
(www.winsite.com). Eles ainda lhe permitem armazenar seu arquivo
fisicamente em seus servidores.
Como um programador Delphi, você tem duas opções básicas:
• Você pode criar um Site da Web que hospedará sua aplicação
Shareware.
• Você pode fazer upload de sua aplicação para o Winsite ou para o
CodeCentral da Borland.
Se você opta para o CodeCentral, você terá que unir-se a comunidade
Borland para ter acesso aos arquivos de upload. Como desenvolvedor
Delphi, entretanto, se você já não fez isto, você provavelmente deva
fazer de qualquer maneira. Muitas submissões valiosas são enviadas
para lá regularmente, como componentes freeware, rotinas, e
atualizações para IB Express e IB Console.
Nota: Se você for um membro do AOL, você também pode fazer upload
de seu arquivo para lá diretamente (nenhum URL preexistente é
necessário).
Antes de você fazer upload de sua aplicação, entretanto, existe algum
trabalho preparatório que precisa ser realizado.
Crie uma instalação profissional
Um boa primeira impressão é muito importante quando lidando com
clientes potenciais. Se sua aplicação se parece algo que foi lançado
junto sem muito pensamento ou sem preocupação, não será muito
provável que eles levem isto a serio, ou seu criador (você), seriamente.
Uma ajuda para apresentar um produto profissional com seu software é
usar um instalador. O InstallShield Express é incluído com a maioria das
edições do Delphi. Usando este, você pode facilmente criar uma
instalação para sua aplicação Shareware. Usando InstallShield para
criar sua instalação está além do âmbito deste artigo, mas é fácil usar e
contem seu próprio arquivo de Ajuda para lhe mostra como iniciar.
Falando de arquivos de Ajudar, além de seu EXE, o onipresente
readme.txt, e quaisquer outros arquivos subordinados de suas
necessidades de programa, você também seriamente deve considerar
criar um arquivo de Ajuda independente para sua aplicação.
Nota: além de uma descrição básica de sua aplicação, informações de
direitos autorais, e qualquer outro que você precisa deixar os usuários
conhecerem, seu arquivo readme.txt deve conter suas informações de
contato de forma que clientes saibam para onde enviar o pagamento
(isto está assumindo que você não está aceitando cartões de crédito on-
line).
Uma vez que você tenha criado seus arquivos de instalação usando
InstallShield (ou outra ferramenta de instalação de sua escolha), você
tem então, claro, queira comprimir estes arquivos em um arquivo ZIP
único. Neste ponto, você está pronto para submeter seu arquivo para
vários locais de Shareware.
Além de ter seu arquivo ZIP pronto, também escreva uma descrição
pequena com antecedência como também uma descrição longa de sua
aplicação, porque a maioria dos sites de upload pedi este.
Adicionalmente, uma lista de palavras chaves, às vezes ou pelo menos
é requerida. O mais preciso que você faça sua descrição e lista de
palavras chaves, o mais relevante que seu programa obterá de clientes
potenciais. Sua aplicação pode ajustar as necessidades deles para um
T, mas eles acharão só isto se você faz isto acessível e seus benefícios
óbvio.
Propague a
Finalmente, você está pronto para anunciar a existência de sua nova
aplicação. Com URL na mão (ou, ser mais preciso, colado em Notepad
ou sua substituição de Notepad, junto com suas descrições de programa
e palavras-chaves), você pode então visitar os seguintes locais, onde
você pode fazer o mundo ciente de sua melhor “ratoeira”:
• www.simtel.net
• www.upload.com
• www.tucows.com
• www.winsite.com/help/howtocontrib.html
Agora você faça isto!
Como você pode ver, criando, comercializando, e desdobrando
Shareware não é trivial. Por outro lado, não é ciência de foguete,
qualquer um. Com uma boa idéia, trabalho duro, e planejamentos
sólidos, podem acrescentar suas habilidades de programação, proveja
um pedaço valioso de software para a comunidade mundial, e faça
algum dinheiro para inicializar!
Clay Shannon
BClayShannon@aol.com
Além de escrever sobre o Delphi, Clay Shannon é o autor de dois
romances: “Twisted Roads”, que apresenta um desenvolvedor Delphi
como um dos principais personagens, e “The Resurrection of Samuel
Clemens”. Para mais informações acesse:
http://www.greatunpublished.com/bookstore/author.php3?
accountID=GRTU00694 ou
http://hometown.aol.com/bclayshannon/myhomepage/index.html
O Projeto em Delphi, Clay está mais orgulhoso de seu programa “Bible
XRef”. Que você pode baixa-lo de:
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=16435
CodeCentral Borland ou http://www.winsite.com/bin/Info?
4000000036430
www.guiadodelphi.com.br
Traduzido por: Marcos Ribeiro
16/12/2001
732 - Os limites do InterBase
OBS:
É necessário ter a biblioteca psapi.dll
instalada.
procedure FinalizaListaProcessosNT;
- Libera a memória ocupada pelos itens
da lista lstProcesses
function
IsFileActive(fileName:string):Boolean;
- verifica se um arquivo 8.3 DOS está
carregado
function
GetProcessoIDfromFileName(fileName:string)
: DWORD;
- pega o numero do processo (Thread
principal do arquivo
function
GetProcessofromFileName(fileName:string):
Integer;
- pega o numero do processo pelo nome do
arquivo
function
TerminateProcessbyFileName(FileName:String
):Boolean;
- terminador do processo utilizando o
nome doa rquivo como referencia
procedure
RemoveProcessoListaNome(fileName:string);
- executado internamente apos o
terminateProcessbyfilename
Function
GETWindowbyThread(idThread:DWORD): HWND;
- pega o HWND de uma janela cujo
idthread foi informado
function
GetWindowfromFileName(fileName:string):
DWORD;
- pega HWND da janela de um arquivo
function
GetThreadIDfromFileName(fileName:string):
DWORD;
- pega o Numero da Thread Principal do
Arquivo
interface
uses
Windows, SysUtils, Classes, Psapi,
ShellApi;
procedure ListaProcessosNT;
procedure FinalizaListaProcessosNT;
function
IsFileActive(fileName:string):Boolean;
function
TerminateProcessbyFileName(FileName:String
):Boolean;
procedure
RemoveProcessoListaNome(fileName:string);
procedure ExecApp(AFileName: String;
bWait: Boolean);
Function
GETWindowbyThread(idThread:DWORD): HWND;
function
GetWindowfromFileName(fileName:string):
DWORD;
function
GetThreadIDfromFileName(fileName:string):
DWORD;
function
GetProcessoIDfromFileName(fileName:string)
: DWORD;
function
GetProcessofromFileName(fileName:string):
Integer;
type
PItem=^TItem;
TItem=record
Nome : String[200];
ProcessID : DWORD;
ThreadID : DWORD;
Window : HWND;
Processo : Integer;
end;
var
i: Integer;
Ignore: Boolean;
StartInfo: TStartupInfo;
ProcInfo: TProcessInformation;
lstProcesses : Tlist;
ModuleCount: Cardinal;
Modules: array[0..512] of DWord;
Proceso: THandle;
ProcesoName: array[0..512] of Char;
ProcesoNameStr: string;
Procesoes: array[0..512] of DWord;
Used: Cardinal;
Item :Titem;
lstWin : TStrings;
implementation
procedure ListaProcessosNT;
var
_PItem : PItem;
locHandle : THandle;
j: integer;
begin
if Not Assigned(lstProcesses)
then lstProcesses := Tlist.Create
else begin
FinalizaListaProcessosNT;
lstProcesses := Tlist.Create;
end;
locHandle :=0;
Win32Check(EnumProcesses(@Procesoes[0],
sizeof(Procesoes), Used));
for j := 0 to (Used div sizeof(DWord)) -
1 do begin
Ignore := False;
Proceso :=
OpenProcess(PROCESS_QUERY_INFORMATION or
PROCESS_VM_READ,False, Procesoes[j]);
if Proceso = 0 then
begin
ProcesoNameStr := ‘unknown’;
end
else
begin
try
Win32Check(EnumProcessModules(Proceso,
@Modules[0], sizeof(Modules[0]),
ModuleCount));
GetModuleBaseName(Proceso, Modules[0],
ProcesoName, sizeof(ProcesoName));
ProcesoNameStr := string(ProcesoName);
locHandle := Proceso;
CloseHandle(Proceso);
except
CloseHandle(Proceso);
Ignore := True;
end;
end;
if not Ignore then
begin
GetMem(_PItem,Sizeof(item));
_PItem^.Nome := ProcesoNameStr;
_PItem^.Processo := Proceso;
_PItem^.ProcessID := Procesoes[j];
_PItem^.ThreadID := Procesoes[j];
_PItem^.Window :=
GETWindowbyThread(_PItem^.ThreadID);
lstProcesses.add(_PItem);
end;
end;
end;
procedure FinalizaListaProcessosNT;
var
j:integer;
begin
for j:=0 to lstProcesses.Count-1 do
Freemem(PItem(lstProcesses.Items[j]),Sizeo
f(item));
lstProcesses.Free;
end;
function
IsFileActive(fileName:string):Boolean;
var
lnome :string;
j:integer;
begin
// Atualiza lista de processos na memoria
ListaProcessosNT;
// — necessário para localizar todos os
itens carregados na memória no momento
Result := false;
for j:=0 to lstProcesses.Count-1 do
begin
lnome :=
PItem(lstProcesses.items[j])^.Nome;
if (uppercase(lnome) =
Uppercase(filename))
then begin
Result := True;
break;
end;
end;
end;
function
GetProcessoIDfromFileName(fileName:string)
: DWORD;
var
j :integer;
begin
Result := 0;
for j:=0 to lstProcesses.Count-1 do
if
uppercase(PItem(lstProcesses.items[j])^.No
me) = Uppercase(filename)
then begin
Result :=
PItem(lstProcesses.items[j])^.ProcessID;
break;
end;
end;
function
GetThreadIDfromFileName(fileName:string):
DWORD;
var
j :integer;
begin
Result := 0;
for j:=0 to lstProcesses.Count-1 do
if
uppercase(PItem(lstProcesses.items[j])^.No
me) = Uppercase(filename)
then begin
Result :=
PItem(lstProcesses.items[j])^.ThreadID;
break;
end;
end;
function
GetWindowfromFileName(fileName:string):
DWORD;
var
j :integer;
begin
Result := 0;
for j:=0 to lstProcesses.Count-1 do
if
uppercase(PItem(lstProcesses.items[j])^.No
me) = Uppercase(filename)
then begin
Result :=
PItem(lstProcesses.items[j])^.Window;
break;
end;
end;
function
GetProcessofromFileName(fileName:string):
Integer;
var
j :integer;
begin
Result := 0;
for j:=0 to lstProcesses.Count-1 do
if
uppercase(PItem(lstProcesses.items[j])^.No
me) = Uppercase(filename)
then begin
Result :=
PItem(lstProcesses.items[j])^.Processo;
break;
end;
end;
function
TerminateProcessbyFileName(FileName:String
):Boolean;
var
Process: THandle;
ProcessId, exitcode: DWord;
begin
Result := False;
ProcessId :=
GetProcessoIDfromFileName(FileName);
Process :=
OpenProcess(PROCESS_TERMINATE, False,
ProcessId);
if Process = 0 then exit;
TerminateProcess(Process,1);
CloseHandle(Process);
Result := True;
// retirar da lista de processos
RemoveProcessoListaNome(FileName);
end;
procedure
RemoveProcessoListaNome(fileName:string);
var
j :integer;
begin
for j:=0 to lstProcesses.Count-1 do
if
uppercase(PItem(lstProcesses.items[j])^.No
me) = Uppercase(filename) then
begin
FreeMem(PItem(lstProcesses.items[j]),sizeo
f(item));
lstprocesses.Delete(j);
break;
end;
end;
{
//Caso seja informado true no parâmetro
bWait, a rotina deve esperar o término do
processo através da função de sinconização
WaitForSingleObject.
Exemplo:
procedure TForm1.Button1Click(Sender:
TObject);
begin
ExecApp(‘c:\windows\calc.exe’,true); //
Epera terminar
end;
}
procedure ExecApp(AFileName: String;
bWait: Boolean);
var
RetCode: Boolean;
begin
StartInfo.cb := SizeOf(TStartupInfo);
RetCode :=
CreateProcess(PChar(AFileName), nil, nil,
nil, False,
CREATE_NEW_PROCESS_GROUP or
NORMAL_PRIORITY_CLASS,
nil, nil, StartInfo, ProcInfo);
// Verifica se criou processo e se
espera terminar
if (RetCode and bWait) then
WaitForSingleObject(ProcInfo.hProcess,
INFINITE);
end;
Function
GETWindowbyThread(idThread:DWORD): HWND;
var
retorno :HWND;
Function Windowlistbythread(hWnd: HWND;
lParam: LPARAM): BOOL;stdcall;
Var
sgTitle : Array[0..255] of char;
sgBase : String;
sgH : String;
inLen : Integer;
sgText : String;
dwProcess : DWord;
Begin
GetWindowThreadProcessId(hWnd,@dwProcess);
if dwProcess = idThread then
begin
retorno:=hWnd;
end;
Result := true;
End;
Begin
Try
retorno := 0;
EnumWindows(@Windowlistbythread,0);
Result := retorno;
Except
Result :=0;
exit;
End;
end;
end.
Dica Enviada por Heverton Luiz Fornazari
743 - Como adicionar uma linha
formatada (cor, negrito, etc) num
RichEdit
Richedit1.SelAttributes.Color:=clBLue; //
Cor Azul
Richedit1.SelAttributes.Style:=
[fsBold,fsUnderline]; // Negrito e
sublinhado
Richedit1.Lines.Add(‘Linha’); // Adiciona
linha
Richedit1.SelAttributes.Style:=[]; //
Volta ao estilo normal
Richedit1.SelAttributes.Color:=clBlack; //
Volta à cor normal
Dica enviada por Marcus
744 - Criando fontes no Delphi
PARA CRIAR UMA FONTE COMO A TIMES NEW
ROMAN:
CreateFont(18,9,7,7,FW_LIGHT,0,0,0,DEFAULT
_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_P
RECIS,1,2,‘MyFont’);
PARA CRIAR A FIXEDSYS:
CreateFont(15,8,9,9,FW_LIGHT,0,0,0,DEFAULT
_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_P
RECIS,1,FF_MODERN,‘MyFont’);
PARA CRIAR A FIXEDSYS TACHADA E
SUBLINHADA:
CreateFont(15,8,9,9,FW_LIGHT,0,1,1,DEFAULT
_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_P
RECIS,1,FF_MODERN,‘MyFont’);
PARA CRIAR UM MODELO BONITO PARECIDO COM
A MS SANS SERIF E A ARIAL:
CreateFont(16,6,0,0,FW_LIGHT,0,0,0,DEFAULT
_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_P
RECIS,0,FF_SWISS,‘MyFont’)
PARA CRIAR UM MODELO BONITO QUE SE
ASSEMELHA COM A ARIAL ITÁLICO:
CreateFont(17,5,0,0,FW_LIGHT,1,0,0,DEFAULT_CHAR
SET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS
,2,FF_SWISS,‘MyFont’);
OUTRO MODELO PARECIDO COM A ARIAL:
CreateFont(16,5,0,0,FW_LIGHT,1,0,0,DEFAULT
_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_P
RECIS,0,FF_SWISS,‘MyFont’);
MODELO PARECIDO COM TAHOMA (OU VERDANA):
CreateFont(16,6,0,0,FW_LIGHT,0,0,0,DEFAULT
_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_P
RECIS,2,FF_SWISS,‘MyFont’);
Essas funções retornam um valor inteiro. Para usá-los
em um componente que tenha a propriedade ‘Handle’
de um objeto ‘TFont’. Exemplo:
Edit1.Font.Handle := CreateFont(…);
Memo1.Font.Handle := CreateFont(…);
procedure TForm1.Button1Click(Sender:
TObject);
begin
ConnectionKind;
end;
748 - Comandos para Dial-up com
Delphi
Alem de poder usar o ShellExecute, WinExec…
podemos utilizar tambem varias APIs…vejam :
RasDial // para discar
RasCreatePhoneBookEntry // criar uma nova entrada
RAS
RasHangUp // desconectar
RasEnumConnection // para enumerar as coneccoes
ativas
entre varias outras.
No help do DELPHI contem a descricao delas (veja em
WIN32.HLP).
749 - Como usar os arquivos QRP
criados com QuickReport
para exibir o arquivo:
QuickRep1.Prepare;
QuickRep1.QRPrinter.Load(‘c:\teste.qrp’);
QuickRep1.QRPrinter.Preview;
Application.ProcessMessages;
depois que exibir precisa liberar, caso contrário trava
tudo :
QuickRep1.QRPrinter.Free;
QuickRep1.QRPrinter := nil;
750 - Como incrementar a Barra de
Status
No formulário principal coloque uma statusbar com 3
panels,1 time e aplicationeventos e digite as funções
abaixo ->
function mostrahora:string;
begin
mostrahora:=timetostr(time);
end;
function mostradata:string;
var
dthoje:tdatetime;
diasemana:integer;
strdiasemana:string;
begin
dthoje:=date;
diasemana:=dayofweek(dthoje);
case diasemana of
1:strdiasemana:=‘Domingo’;
2:strdiasemana:=‘Segunda-feira’;
3:strdiasemana:=‘Terça-feira’;
4:strdiasemana:=‘Quarta-feira’;
5:strdiasemana:=‘Quinta-feira’;
6:strdiasemana:=‘Sexta-feira’;
7:strdiasemana:=‘Sábado’;
end;
mostradata:=strdiasemana+’
‘+datetostr(dthoje);
end;
// Selecione o aplicationeventos e na guia
eventos do objeto inspector depois clique
no evento OnHint e digite o código ->
procedure
TFnomedoform.ApplicationEvents1Hint(Sender
: TObject);
Begin
StatusBar1.Panels[2].Text:=Application.Hin
t;
// todos os hints do seu projeto
apareceram no statusbar
end;
procedure TFnomedoform.Timer1Timer(Sender:
TObject);
var
presente:tdatetime;
ano,mes,dia:word;
begin
presente:=now;
decodedate(presente,ano,mes,dia);
case mes of
1:STATUSBAR1.PANELS[1].TEXT:=’ JANEIRO
‘+inttostr(ano);
2:STATUSBAR1.PANELS[1].TEXT:=‘FEVEREIRO’+i
nttostr(ano);
3:STATUSBAR1.PANELS[1].TEXT:=‘MARÇO
‘+inttostr(ano);
4:STATUSBAR1.PANELS[1].TEXT:=‘ABRIL
‘+inttostr(ano);
5:STATUSBAR1.PANELS[1].TEXT:=‘MAIO
‘+inttostr(ano);
6:STATUSBAR1.PANELS[1].TEXT:=‘JUNHO
‘+inttostr(ano);
7:STATUSBAR1.PANELS[1].TEXT:=‘JULHO
‘+inttostr(ano);
8:STATUSBAR1.PANELS[1].TEXT:=‘AGOSTO
‘+inttostr(ano);
9:STATUSBAR1.PANELS[1].TEXT:=‘SETEMBRO
‘+inttostr(ano);
10:STATUSBAR1.PANELS[1].TEXT:=‘OUTUBRO
‘+inttostr(ano);
11:STATUSBAR1.PANELS[1].TEXT:=‘NOVEMBRO
‘+inttostr(ano);
12:STATUSBAR1.PANELS[1].TEXT:=‘DEZEMBRO
‘+inttostr(ano);
end;
STATUSBAR1.PANELS[0].TEXT:=mostrahora();
STATUSBAR1.PANELS[1].TEXT:=mostradata();
end;
unit Unit_AutoDelecao;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TDriveType = (dtUnknown, dtNoDrive,
dtFloppy, dtFixed, dtNetwork, dtCDROM,
dtRAM);
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender:
TObject);
begin
DelExe;
end;
end.
753 - Funções de CRC
{*****************************************
********************}
{ CRC Calculator Unit for Delphi
16/32 }
{ Version:
2.0
}
{ Author: Aleksey
Kuznetsov
}
{ E-Mail:
aleksey@utilmind.com
}
{ Home Page:
http://www.utilmind.com
}
{ Created: March, 30, 1999 for Karol
Suchanek }
{ Modified: April, 6,
1999 }
{ Legal: Copyright (c) 1999, UtilMind
Solutions }
{ Idea: Edwin T.
Floyd
}
{*****************************************
********************}
{ This unit provides three speed-optimized
functions to }
{ compute (or continue computation of) a
Cyclic Redundency }
{ Check (CRC). Applicable to XModem
protocol (16-bit CRC), }
{ SEA’s “ARC” utility, PKZip (32-bit CRC)
and many others }
{ compatible
software.
}
{ Please see TESTCRC.DPR for
example. }
{*****************************************
********************}
{ Each function takes three
parameters: }
{
}
{ InitCRC - The initial CRC value. This
may be the }
{ recommended initialization value if this
is the first or }
{ only block to be checked, or this may be
a previously }
{ computed CRC value if this is a
continuation. }
{ XModem and ARC usually starts with zero
(0), 32 bit crc }
{ starts with all bits on
($FFFFFFFF). }
{
}
{ Buffer - An untyped parameter (Pointer^)
specifying the }
{ beginning of the memory area to be
checked. }
{
}
{ Length - A word indicating the length of
the memory area to }
{ be checked. If Length is zero, the
function returns the }
{ value of
InitCRC.
}
{
}
{ The function result is the updated
CRC. }
{*****************************************
********************}
unit CRC;
interface
implementation
const
CrcArcTab: Array[0..$FF] of Word =
($00000, $0C0C1, $0C181, $00140, $0C301,
$003C0, $00280, $0C241,
$0C601, $006C0, $00780, $0C741, $00500,
$0C5C1, $0C481, $00440,
$0CC01, $00CC0, $00D80, $0CD41, $00F00,
$0CFC1, $0CE81, $00E40,
$00A00, $0CAC1, $0CB81, $00B40, $0C901,
$009C0, $00880, $0C841,
$0D801, $018C0, $01980, $0D941, $01B00,
$0DBC1, $0DA81, $01A40,
$01E00, $0DEC1, $0DF81, $01F40, $0DD01,
$01DC0, $01C80, $0DC41,
$01400, $0D4C1, $0D581, $01540, $0D701,
$017C0, $01680, $0D641,
$0D201, $012C0, $01380, $0D341, $01100,
$0D1C1, $0D081, $01040,
$0F001, $030C0, $03180, $0F141, $03300,
$0F3C1, $0F281, $03240,
$03600, $0F6C1, $0F781, $03740, $0F501,
$035C0, $03480, $0F441,
$03C00, $0FCC1, $0FD81, $03D40, $0FF01,
$03FC0, $03E80, $0FE41,
$0FA01, $03AC0, $03B80, $0FB41, $03900,
$0F9C1, $0F881, $03840,
$02800, $0E8C1, $0E981, $02940, $0EB01,
$02BC0, $02A80, $0EA41,
$0EE01, $02EC0, $02F80, $0EF41, $02D00,
$0EDC1, $0EC81, $02C40,
$0E401, $024C0, $02580, $0E541, $02700,
$0E7C1, $0E681, $02640,
$02200, $0E2C1, $0E381, $02340, $0E101,
$021C0, $02080, $0E041,
$0A001, $060C0, $06180, $0A141, $06300,
$0A3C1, $0A281, $06240,
$06600, $0A6C1, $0A781, $06740, $0A501,
$065C0, $06480, $0A441,
$06C00, $0ACC1, $0AD81, $06D40, $0AF01,
$06FC0, $06E80, $0AE41,
$0AA01, $06AC0, $06B80, $0AB41, $06900,
$0A9C1, $0A881, $06840,
$07800, $0B8C1, $0B981, $07940, $0BB01,
$07BC0, $07A80, $0BA41,
$0BE01, $07EC0, $07F80, $0BF41, $07D00,
$0BDC1, $0BC81, $07C40,
$0B401, $074C0, $07580, $0B541, $07700,
$0B7C1, $0B681, $07640,
$07200, $0B2C1, $0B381, $07340, $0B101,
$071C0, $07080, $0B041,
$05000, $090C1, $09181, $05140, $09301,
$053C0, $05280, $09241,
$09601, $056C0, $05780, $09741, $05500,
$095C1, $09481, $05440,
$09C01, $05CC0, $05D80, $09D41, $05F00,
$09FC1, $09E81, $05E40,
$05A00, $09AC1, $09B81, $05B40, $09901,
$059C0, $05880, $09841,
$08801, $048C0, $04980, $08941, $04B00,
$08BC1, $08A81, $04A40,
$04E00, $08EC1, $08F81, $04F40, $08D01,
$04DC0, $04C80, $08C41,
$04400, $084C1, $08581, $04540, $08701,
$047C0, $04680, $08641,
$08201, $042C0, $04380, $08341, $04100,
$081C1, $08081, $04040);
end;
Result := True;
except
Result := False;
end;
try
CloseFile(f);
except
end;
{$I-}
end;
end.
//Use-a assim:
procedure TForm1.BitBtn1Click(Sender:
TObject);
var
f: File;
CRC16: Word;
CRC32: LongInt;
CRCArc: Word;
procedure Error;
begin
Application.MessageBox(‘Open error.’, ‘I/O
Error’, mb_Ok or mb_IconStop)
end;
begin
if OpenDialog.Execute then
begin
if not FileCRC16(OpenDialog.FileName,
CRC16) then
begin
Error;
Exit;
end;
Label1.Caption := ‘CRC16 = ‘ +
IntToStr(CRC16);
if not FileCRC32(OpenDialog.FileName,
CRC32) then
begin
Error;
Exit;
end;
Label2.Caption := ‘CRC32 = ‘ +
IntToStr(CRC32);
if not FileCRCArc(OpenDialog.FileName,
CRCArc) then
begin
Error;
Exit;
end;
Label4.Caption := ‘CRCArc = ‘ +
IntToStr(CRCArc);
end;
end;
754 - Funções para detectar o
SoftIce
Pra quem não conhece o SoftIce é um software
comunmente usado para Crackear programas.
Então uma boa saida é usar essa dica juntamente com a
dica 752 para proteger bem seu programa!
Se quer mesmo proteger seu programa de crackers
(coisa que hoje em dia é muito dificil) é só usar também
a dica 753 de CRC.
procedure TForm1.Button1Click(Sender:
TObject);
begin
cripto(Image1.Picture.Bitmap, 1);
Image1.Refresh;
end;
Ao chamar a rotina passamos como parâmetro o
caminho da imagem que no exemplo foi utilizado o
componente image e 1 como um valor inteiro para
retornamos a imagem normal, logo após a execução da
nossa procedure atualizamos o image para que ele
possa exibir nossa imagem criptografada.
Soma :=
StrToInt(FloatToStr((StrToInt(sTitulo[10])
* 4) +
(StrToInt(sTitulo[11]) * 3) + (Dig1 *
2)));
Resto := Soma mod 11;
Function RetornaTexto(Texto:String;
Caracter:Char):String;
var
I,Posicao1,Posicao2:Integer;
TextoInvertido:String;
begin
Result:=”;
for I := Length(Texto) downto 1 do
begin
TextoInvertido:=TextoInvertido+Texto[I]
end;
Posicao1:=Pos(Caracter,Texto)+1;
Posicao2:=Pos(Caracter,TextoInvertido)-1;
Result:=Copy(Texto,Posicao1,Length(Texto)-
(Posicao1+Posicao2));
end;
Uso:
RetornaTexto(‘Exemplo de um “texto” entre
aspas’,’”’);
retornará uma string contendo a palavra texto.
Enviada por:
Marcus Vitoratti
761 - Mover Timage sem que ele
“pisque”
Quando você vai mover um TShape ou um TImage ou
um TLabel, etc. Ele fica “piscando”. Para que não ocorra
isto coloque no OnCreate do Form:
Enviada por:
Marcus Vitoratti
762 - Como colocar Captions no
DBNavigator
type
TDBNewNavigator = class(TDBNavigator);
procedure TForm1.FormCreate(Sender:
TObject);
var
B: TNavigateBtn;
begin
for B := Low(TNavigateBtn) to
High(TNavigateBtn) do
with
TDBNewNavigator(DBNavigator1).Buttons[B]
do
begin
Case Index of
nbFirst : Caption := ‘Inicio’;
nbPrior : Caption := ‘Anterior’;
nbNext : Caption := ‘Próximo’;
nbLast : Caption := ‘Último’;
nbInsert : Caption := ‘Novo’;
nbDelete : Caption := ‘Apagar’;
nbEdit : Caption := ‘Alterar’;
nbPost : Caption := ‘Gravar’;
nbCancel : Caption := ‘Cancelar’;
nbRefresh: Caption := ‘Atualizar’;
End;
Layout := blGlyphTop; { uses
Buttons}
Hint := Caption;
ShowHint := True;
end;
end;
end;
Enviada por:
Carlos Hegeto Junior
763 - Como separar termos de uma
string
Como separar termos de uma string usando comandos
básicos como Delete, Copy e Pos e guardar os valores
em um array.
Supondo que tenho um arquivo que o formato de cada
linha seja “website|titulo|descricao|categoria”, gostaria
de enviar cada termo para um array e disponibilizar em
um Listbox o website e a categoria. Difícil? Não.
var
MeuArray: array of array of string;
// Em MeuArray tenho que:
// MeuArray[0][0] = Website da 1ª linha
// MeuArray[0][1] = Título da 1ª linha
// MeuArray[0][2] = Descrição da 1ª
linha
// MeuArray[0][3] = Categoria da 1ª
linha
Arquivo: TStringList;
// Arquivo é uma variável TStringList,
que facilitará o uso das strings;
LoopI,PosBarra: Integer;
// Em LoopI será executado um “for”.
// PosBarra é a posição de “|”.
Linha: String;
// Linha é a linha que está sendo
executada no momento.
begin
Arquivo:=TStringList.Create;
Arquivo.LoadFromFile(‘C:\Sites.txt’); //
Abrir o arquivo C:\Sites.txt.
SetLength(MeuArray,Arquivo.Count+1,4);
// Definir o tamanho do array.
for LoopI := 0 to Arquivo.Count -1 do //
Fazer o “for”.
begin
Linha:=Arquivo.Strings[LoopI]; //
Linha atual.
PosBarra:=Pos(‘|’,Linha);
MeuArray[LoopI][0] :=
Copy(Linha,1,PosBarra-1);
Delete(Linha,1,PosBarra); // Deleta,
porque já peguei valor do 1º
PosBarra:=Pos(‘|’,Linha); // Pega
novamente a posição de “|”
MeuArray[LoopI][1] :=
Copy(Linha,1,PosBarra-1);
Delete(Linha,1,PosBarra);
PosBarra:=Pos(‘|’,Linha);
MeuArray[LoopI][2] :=
Copy(Linha,1,PosBarra-1);
Delete(Linha,1,PosBarra);
PosBarra:=Pos(‘|’,Linha);
MeuArray[LoopI][3] := Linha; // É o
que restou da variável Linha.
ListBox1.Items.Add(MeuArray[LoopI]
[0]+’: ‘+MeuArray[LoopI][2]);
end;
Arquivo.Free;
end;
Enviada por:
Marcus Vitoratti
764 - Como arredondar um valor do
tipo Float / Double
Exemplo :
QryBasico.FieldByName(‘Valor’).AsFloat
:= SimpoRound(Passe Seu Valor Aqui);
Enviada por:
Jason Lopes G Silva
765 - Como transformar de uma
Classe para outra
Você tem a variavel Sender como sendo TObject, mas
você gostaria de usar esta TObject como um TForm ?
Se você tentou assim:
Sender.show;
(Sender as TForm).show;
Enviada por:
Bruno Martins Stuani
766 - Selecionando vários objetos
dentro de um outro como se fosse
selecionar um objeto imposto no
formulário:
Segure o Control, clique e arraste o cursor do mouse
dentro de um objeto que contenha outro dentro dele
Enviada por:
Bruno Martins Stuani
767 - Como colocar imagens em um
TStatusBar
1) Insira um TStatusBar em seu projeto.
2) Faça os “Panels”.
3) Vamos supor que queira que o “Panel 2” (Lembre-se
que começa com 0 a contagem) receba a imagem,
mude a propriedade Style do “Panel 2” para
psOwnerDraw. Em seguida, no evento OnDrawPanel
coloque:
var
Imagem:TBitmap;
begin
if Panel = 2 then // Caso seja o “Panel
2”…
begin
Imagem:=TBitmap.Create;
Imagem.LoadFromFile(‘C:\Imagem.Bmp’);
// Estou carregando de um arquivo, mas há
possibilidades de carregar de um resource
também.
try
StatusBar1.Canvas.Draw(Rect.Left,Rect.Top,
Imagem) // Tenta carregar.
finally
Imagem.Free;
end; // Depois de carregar, libera a
imagem.
end;
end;
Enviada por:
Marcus Vitoratti
768 - Validando CEP
Function ValidarCEP(const CEP: string):
string;
var
I: integer;
begin
Result := ”;
for I := 1 to Length(CEP) do
if CEP[I] in [‘0’..‘9’] then
Result := Result + CEP[I];
if Length(Result) <> 8 then
raise Exception.Create(‘CEP
inválido.’)
else
Result := Copy(Result, 1, 2) + ‘.’ +
Copy(Result, 3, 3) + ‘-‘ + Copy(Result, 6,
3);
end;
Enviada por:
Fábio André Campos da Cruz
769 - Como obter uma string entre
outras duas
function
Copy(Frase,Inicio,Fim:String):String;
{ função criada por Marcus Vitoratti }
var
iAux,kAux:Integer;
begin
Result:=”;
if (Pos(Fim,Frase) <> 0) and
(Pos(Inicio,Frase)<>0) then
begin
iAux:=Pos(Inicio,Frase)+length(Inicio);
kAux:=Pos(Fim,Frase);
Result:=Copy(Frase,iAux,kAux-iAux);
end;
end;
Exemplo:
label1.caption:= Copy(‘<TITLE>Título da
página</TITLE>’,’<TITLE>’,’</TITLE>’);
//retornará a string ‘Título da página’.
var
Form2: TForm2;
implementation
Constructor TForm2.Create(AOwner :
TComponent; pParm1, pParm2 : String);
begin
inherited Create(AOwner);
Parametro1 := pParm1;
Parametro2 := pParm2;
end;
Enviada por:
Gelson Luiz
771 - Transforma a imagem em
negativo de fotografia
procedure ColorToNegative(ABmp: TBitmap);
//
// Transforma a imagem em negativo de
fotografia
//
// Use-o assim:
//
// var x: TBitmap;
// begin
//
// x := TBitmap.create;
// x.LoadFromFile(‘c:\MVC-267S.bmp’);
// ColorToNegative(x);
// image1.Picture.Assign(x);
// end;
//
//
const
_high = 255;
var
c: TCursor;
x, y: Integer;
ColorRGB: LongInt;
begin
c := Screen.Cursor;
Screen.Cursor := crHourGlass;
for y := 0 to (ABmp.Height - 1) do
for x := 0 to (ABmp.Width - 1) do
begin
ColorRGB :=
ColorToRGB(ABmp.Canvas.Pixels[x, y]);
ABmp.Canvas.Pixels[x, y] :=
PaletteRGB(_high -
GetRValue(ColorRGB),_high -
GetGValue(ColorRGB), _high -
GetBValue(ColorRGB));
end;
Screen.Cursor := c;
end;
sAux.Text:=StringReplace(ALinha,ASeparador
,#13#10,[rfReplaceAll, rfIgnoreCase]);
if APosicao <= sAux.Count then
Result:=sAux.Strings[APosicao-1];
sAux.Free;
end;
Utilização:
ObterTermo(2, ‘:’, ‘Abc:Def:Ghi’);
retornará ‘Def’
ListBox1.Items.SaveToFile(extractfilepath(
application.ExeName)+‘items.txt’);
end;
lista2:=TStringList.Create;
lista1:=TStringList.Create;
lista1.LoadFromFile(extractfilepath(applic
ation.ExeName)+‘items.txt’);
for i:=0 to lista1.Count-1 do
begin
if lista1.Strings[i]<>” then
begin
lista2.Add(lista1.Strings[i]);
lista2.SaveToFile(extractfilepath(applicat
ion.ExeName)+‘items.txt’);
end
else
lista2.SaveToFile(extractfilepath(applicat
ion.ExeName)+‘items.txt’);
end;
ListBox1.Items.LoadFromFile(extractfilepat
h(application.ExeName)+‘items.txt’);
DeleteFile(extractfilepath(application.Exe
Name)+‘items.txt’);
end;
Procedure EntreDatas(DataFinal,DataInicial
: TDate ; var Anos,Meses,Dias : Integer) ;
//
// Retorna a diferença em Dias,Meses e
Anos entre 2 datas
//
Function Calcula(Periodo : Integer) :
Integer ;
var
intCont : Integer ;
begin
intCont := 0 ;
Repeat
Inc(intCont) ;
DataFinal :=
IncMonth(DataFinal,Periodo * -1) ;
Until DataFinal < DataInicial ;
DataFinal :=
IncMonth(DataFinal,Periodo) ;
Inc(intCont,-1) ;
Result := intCont ;
End ;
begin
if DataFinal <= DataInicial then
begin
Anos := 0 ;
Meses := 0 ;
Dias := 0 ;
exit ;
end;
Anos := Calcula(12) ;
Meses := Calcula(1) ;
Dias := Round(DataFinal - DataInicial) ;
end;
Um abraço
Application.OnMessage := ChamaHelp ;
procedure TfMtCpPrMs.Button1Click(Sender:
TObject);
var
I : Integer;
NovoItem : TMenuItem;
begin
For I := 0 to Screen.Fonts.Count - 1 do
begin
NovoItem :=
TMenuItem.Create(MainMenu1);
NovoItem.Caption := Screen.Fonts[I];
MainMenu1.Items[1].Items[2].Insert(I,NovoI
tem);
end;
NovoItem.Free;
end;
procedure TfMtCpPrMs.CapturaClick(Sender:
TObject);
begin
ShowMessage(‘Você escolheu a fonte: ‘ +
TMenuItem(Sender).Caption);
end;
procedure TfMtCpPrMs.Button1Click(Sender:
TObject);
var
I: Integer;
NovoItem : TMenuItem;
begin
For I := 0 to Screen.Fonts.Count - 1 do
begin
NovoItem :=
TMenuItem.Create(MainMenu1);
NovoItem.Caption := Screen.Fonts[I];
MainMenu1.Items[1].Items[2].Insert(I,NovoI
tem);
MainMenu1.Items[1].Items[2].Items[I].OnCli
ck := CapturaClick;
end;
NovoItem.Free;
end;
procedure TForm1.MapeamentosDisponiveis;
var
I : Integer;
Caminho, Drive : String;
Tamanho : Cardinal;
begin
SetLength(Caminho,255);
Tamanho:=255;
For I:=0 to 25 do
begin
Drive := Chr(Ord(‘A’)+I)+’:’;
if
WNetGetConnection(PChar(Drive),PChar(Camin
ho),Tamanho) = NO_ERROR then
ListBox1.Items.Add(LowerCase(Drive +
‘ - ‘+Caminho));
end;
end;
ex:
Digamos que temos dois forms. Form1 e Form2. O
Form1 deve chamar o Form2 (que está setado para
auto-criação)!
o código abaixo chama o form2 (a partir de um button)
com um efeito bem legal
procedure TForm1.Button1Click(Sender:
TObject); begin
form2.BringToFront;
form1.Hide;
AnimateWindow(form2.Handle,2000,AW_CENTER)
;
form2.show;
end;
procedure TForm2.FormHide(Sender:
TObject);
begin
form1.Show;
end;
Lista de Animações:
AW_BLEND //Somente no Windows 2000
AW_CENTER
AW_HOR_POSITIVE
AW_HOR_NEGATIVE
AW_VER_POSITIVE
AW_VER_NEGATIVE
procedure
TForm1.PageControl1DrawTab(Control:
TCustomTabControl;
TabIndex: Integer; const Rect: TRect;
Active: Boolean);
begin
case TabIndex of
0: Control.Canvas.Font.Color:=clgreen;
1: Control.Canvas.Font.Color:=clred;
2: Control.Canvas.Font.Color:=clblue;
3:
Control.Canvas.Font.Color:=clYellow;
4:
Control.Canvas.Font.Color:=clMaroon;
5: Control.Canvas.Font.Color:=clWhite;
end;
Control.Canvas.TextOut(Rect.left+5,Rect.to
p+3,PageControl1.Pages[tabindex].Caption);
PageControl1.Pages[TabIndex].Font.Color:=C
ontrol.Canvas.Font.Color;
end;
procedure TForm1.FormCreate(Sender:
TObject);
begin
PageControl1.OwnerDraw:=true;
end;
783 - Como reduzir expressões if
then else
Vamos a um exemplo prático:
if x >= 5 then
Aprovado := True
else
Aprovado := False;
Aprovado := x >= 5;
QuickReport.Prepare;
QuickReport.QRLabel.Caption :=
IntToStr(QuickReport.QRPrinter.PageCount);
depois é só enviar um
QuickReport.Print;
ou
QuickReport.Preview;
785 - Rotina para criptografia mais
absoluta
function Crypt(Action, Src: String):
String;
Label Fim;
var KeyLen : Integer;
KeyPos : Integer;
OffSet : Integer;
Dest, Key : String;
SrcPos : Integer;
SrcAsc : Integer;
TmpSrcAsc : Integer;
Range : Integer;
begin
if (Src = ”) Then
begin
Result:= ”;
Goto Fim;
end;
Key :=
‘YUQL23KL23DF90WI5E1JAS467NMCXXL6JAOAUWWMC
L0AOMM4A4VZYW9KHJUI2347EJHJKDF3424SKL
K3LAKDJSL9RTIKJ’;
Dest := ”;
KeyLen := Length(Key);
KeyPos := 0;
SrcPos := 0;
SrcAsc := 0;
Range := 256;
if (Action = UpperCase(‘C’)) then
begin
Randomize;
OffSet := Random(Range);
Dest := Format(‘%1.2x’,[OffSet]);
for SrcPos := 1 to Length(Src) do
begin
Application.ProcessMessages;
SrcAsc := (Ord(Src[SrcPos]) +
OffSet) Mod 255;
if KeyPos < KeyLen then KeyPos :=
KeyPos + 1 else KeyPos := 1;
SrcAsc := SrcAsc Xor
Ord(Key[KeyPos]);
Dest := Dest + Format(‘%1.2x’,
[SrcAsc]);
OffSet := SrcAsc;
end;
end
Else if (Action = UpperCase(‘D’)) then
begin
OffSet := StrToInt(‘$’+
copy(Src,1,2));
SrcPos := 3;
repeat
SrcAsc := StrToInt(‘$’+
copy(Src,SrcPos,2));
if (KeyPos < KeyLen) Then KeyPos :=
KeyPos + 1 else KeyPos := 1;
TmpSrcAsc := SrcAsc Xor
Ord(Key[KeyPos]);
if TmpSrcAsc <= OffSet then TmpSrcAsc
:= 255 + TmpSrcAsc - OffSet
else TmpSrcAsc := TmpSrcAsc - OffSet;
Dest := Dest + Chr(TmpSrcAsc);
OffSet := SrcAsc;
SrcPos := SrcPos + 2;
until (SrcPos >= Length(Src));
end;
Result:= Dest;
Fim:
end;
Ex: de Descriptografia
Edit3.text:= Crypt(‘D’,Edit2.text);
786 - Exportando uma Tabela ou
uma Query para uma página HTML
Esta dica ensina a exportar os dados de uma
table/query para uma página html. A forma ensinada
abaixo é uma maneira bem rústica de fazer isto, mas
bastante usada ainda. Ele simplesmente lê o conteúdo
do dataset e exportamos para um arquivo texto com
alguns códigos para gerar o arquivo html. Depois de
gerar o arquivo basta abri-lo em seu browser. Vamos ver
e entender o código abaixo.
Primeiramente abra o delphi e inicie uma nova
aplicação, coloque uma table e um botão no seu
formulário. Agora sete a propriedade DatabaseName da
Table1 para “DBDEMOS” e a propriedade TableName
para “Animals.dbf”. Após configurada a table, coloque no
evento onclick do botão o seguinte código:
procedure TForm1.Button1Click(Sender:
TObject);
var
i, j, w: integer;
linha: string;
htmlfile: TextFile;
const
wrap=#13+#10; {estamos declarando esta
constante com o valor da tecla enter …}
begin
AssignFile(HtmlFile,
‘c:\htmlfile.html’);
Rewrite(HtmlFile);
writeln(htmlfile, ‘<html><head>’ + wrap
+ {estamos gerando o inicio do arquivo
html}
‘<title>’+ Table1.name + ‘</title>’ +
wrap +
‘</head>’ + wrap + ‘<body
bgcolor=”#FFFBCB”>’ +
wrap + ‘<table border =1>’ + wrap);
{Nesse ponto iremos gerar a tabela html}
with table1 do
begin
for w:=0 to fieldCount - 1 do
writeln(htmlfile, ‘<td>’ +
(Fields[w].FieldName) + ‘</td>’);
{Na linha de cima iremos gerar uma coluna
em html para cada campo da table 1 com os
seus nomes}
table1.first;
for i:=0 to recordcount-1 do
begin
linha:=’<tr>’+wrap;
for j:=0 to fieldcount-1 do
begin
linha:= linha + ‘<td>’ +
Fields[j].AsString + ‘</td>’;
{Este código pega o valor dos
campos de cada linha da table e joga na
tabela de html}
end;
writeln(htmlfile, linha);
writeln(htmlfile, ‘</tr>’);
next;
end;
end;
writeln(htmlfile, ‘</body></html>’);
{Finaliza o arquivo html}
CloseFile(htmlfile);
end;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure CreateODBCDriver(Const
cDSNName,cExclusive,cDescription,cDataBase
,cDefaultPath,cConfigSql,cDriver: string);
type
TSQLConfigDataSource = function(
hwndParent: HWND; fRequest: WORD;
lpszDriver: LPCSTR;
lpszAttributes: LPCSTR ): BOOL; stdcall;
const
ODBC_ADD_DSN = 1; // Adiciona uma fonte
de dados (data source)
ODBC_CONFIG_DSN = 2; // Configura a
fonte de dados (data source)
ODBC_REMOVE_DSN = 3; // Remove a fonte
de dados (data source)
ODBC_ADD_SYS_DSN = 4; // Adiciona um DSN
no sistema
ODBC_CONFIG_SYS_DSN = 5; // Configura o
DSN do sistema
ODBC_REMOVE_SYS_DSN = 6; // Remove o DSN
do sistema
var
pFn: TSQLConfigDataSource;
hLib: LongWord;
strDriver: string;
strHome: string;
strAttr: string;
strFile: string;
fResult: BOOL;
ModName: array[0..MAX_PATH] of Char;
srInfo : TSearchRec;
begin
Windows.GetModuleFileName( HInstance,
ModName, SizeOf(ModName) );
strHome := ModName;
while ( strHome[length(strHome)] <> ‘' )
do
Delete( strHome, length(strHome), 1 );
strFile := strHome + cDatabase; // Teste
com access (Axes = Access)
hLib := LoadLibrary( pChar(cDefaultPath)
); // carregando para o diretório padrão
if( hLib <> NULL ) then
begin
@pFn := GetProcAddress( hLib,
pChar(cConfigSql) );
if( @pFn <> nil ) then
begin
strDriver := cDriver;
strAttr := Format( ‘DSN=%s’+#0+
‘DBQ=%s’+#0+
‘Exclusive=%s’+#0+
‘Description=%s’+#0+#0,
[cDSNName,strFile,cExclusive,cDescription]
);
fResult := pFn( 0, ODBC_ADD_SYS_DSN,
@strDriver[1], @strAttr[1] );
if( fResult = false ) then
ShowMessage( ‘Falha ao tentar
criar o DSN (Data source).’ );
if( FindFirst( strFile, 0, srInfo )
<> 0 ) then
begin
strDriver := cDriver;
strAttr := Format( ‘DSN=%s’+#0+
‘DBQ=%s’+#0+
‘Exclusive=%s’+#0+
‘Description= %s’+#0+#0+
‘CREATE_DB=”%s”’#0+#0,
[cDSNName,strFile,cExclusive,cDescription,
strFile]);
fResult := pFn( 0,
ODBC_ADD_SYS_DSN, @strDriver[1],
@strAttr[1] );
if( fResult = false ) then
ShowMessage( ‘Falha ao tentar
criar o banco de dados’ );
end;
FindClose( srInfo );
end;
FreeLibrary( hLib );
if fResult then
ShowMessage( ‘Banco de dados
criado.’ );
end
else
begin
ShowMessage( ‘o sistema não pode
carregar a biblioteca ODBCCP32.DLL’ );
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
CreateOdbcDriver(‘Cludelphi DSN’, ‘1’,
‘clubedelphi’, ‘clubedelphi.MDB’,
‘ODBCCP32’, ‘SQLConfigDataSource’,
‘Microsoft Access Driver (*.mdb)’);
end;
end.
{$WARNINGS OFF}
function TfrmEdit.ProjectTypeToUse(const
cPath: string): Integer;
var
SR: TSearchRec;
begin
if not DirectoryExists(cPath) then
begin
ErrMsg(‘Path não localizado!’);
Exit;
end;
try
if FindFirst(cPath +
‘\*.VBP’,faDirectory,SR) = 0 then
Result := VBP_FILTER
else
Result := DPR_FILTER;
except
ErrMsg(‘Falha de sistema -‘ + cPath);
Result := 1
end;
end;
{$WARNINGS ON}
Const
digitos : array[‘0’..‘9’] of string[5]=
(‘00110’,
‘10001’,
‘01001’,
‘11000’,
‘00101’,
‘10100’,
‘01100’,
‘00011’,
‘10010’,
‘01010’);
Var
Numero : String;
Cod1 : Array[1..1000] Of Char;
Cod2 : Array[1..1000] Of Char;
Codigo : Array[1..1000] Of Char;
Digito : String;
c1,c2 : Integer;
x,y,z,h : LongInt;
a,b,c,d : TPoint;
I : Boolean;
Begin
Numero := Cod;
For x := 1 to 1000 Do
Begin
Cod1 [x] := #0;
Cod2 [x] := #0;
Codigo[x] := #0;
End;
c1 := 1;
c2 := 1;
x := 1;
For y := 1 to Length(Numero) div 2 do
Begin
Digito := Digitos[Numero[x ]];
For z := 1 to 5 do
Begin
Cod1[c1] := Digito[z];
Inc(c1);
End;
Digito := Digitos[Numero[x+1]];
For z := 1 to 5 do
Begin
Cod2[c2] := Digito[z];
Inc(c2);
End;
Inc(x,2);
End;
y := 5;
Codigo[1] := ‘0’;
Codigo[2] := ‘0’;
Codigo[3] := ‘0’;
Codigo[4] := ‘0’; { Inicio do Codigo }
For x := 1 to c1-1 do
begin
Codigo[y] := Cod1[x]; Inc(y);
Codigo[y] := Cod2[x]; Inc(y);
end;
Codigo[y] := ‘1’; Inc(y); { Final do
Codigo }
Codigo[y] := ‘0’; Inc(y);
Codigo[y] := ‘0’;
Imagem.Pen .Width := 1;
Imagem.Brush.Color := ClWhite;
Imagem.Pen .Color := ClWhite;
a.x := 1; a.y := 0;
b.x := 1; b.y := 79;
c.x := 2000; c.y := 79;
d.x := 2000; d.y := 0;
Imagem.Polygon([a,b,c,d]);
Imagem.Brush.Color := ClBlack;
Imagem.Pen .Color := ClBlack;
x := 0;
i := True;
for y:=1 to 1000 do
begin
If Codigo[y] <> #0 Then
Begin
If Codigo[y] = ‘0’ then
h := 1
Else
h := 3;
a.x := x; a.y := 0;
b.x := x; b.y := 79;
c.x := x+h-1; c.y := 79;
d.x := x+h-1; d.y := 0;
If i Then
Imagem.Polygon([a,b,c,d]);
i := Not(i);
x := x + h;
End;
end;
end;
Como Usar:
procedure TForm1.Button1Click(Sender:
TObject);
begin
CriaCodigo(‘03213213241’,Image1.Canvas);
end;
procedure TForm1.FormClose(Sender:
TObject; var Action: TCloseAction);
var B : TBitmap;
begin
B:=TBitmap.Create;
try
try
//lembre-se que para este exemplo
funcionar é preciso que o arquivo
// “msg_image.bmp” esteja em “C:"
B.LoadFromFile(‘c:\msg_image.bmp’);
if MessageDlg(‘Confirme’,‘Deseja
realmente sair do programa?’,mtCustom,
[mbYes,mbNo],0,mbNo,B) = mrYes then
Application.Terminate
else
Action:=caNone;
except
ShowMessage(‘Não foi possível abrir
o arquivo “c:\icone.bmp”’);
end;
finally
B.Free;
end;
end;
Conclusões: Ao clicar no ícone para fechar o formulário
você receberá a imagem .bmp da maneira como ela foi
configurada.
Enviada por Jackson Pires
793 - Como gerar numeros
randomicos para loterias
Crie um form com os seguintes objetos:
- Listbox1 com a fonte “Courier New”
- Edit1 com Edit1.Text := 6 Numero de
Dezenas
- Edit2 with Edit2.Text := 49 Valor
Maximo
- Edit3 with Edit3.Text := 10 Numero de
Jogos
- Button1 com onClick com o evento
Button1Click abaixo
procedure TForm1.Button1Click(Sender:
TObject); var
MyList: TStringList;
Times, I, Number: Integer;
cInt, cLen: string;
begin
// make the button disabled to prevent
multiple clicks
Self.enabled := False;
// convert the highest number
Number := StrToInt(Edit2.Text);
// this creates the correct format-
argument for every
// max-numbers (e.g. 49 , 120, 9999 ….)
cLen :=
IntToStr(length(trim(Edit2.text)) + 1);
MyList := TStringList.Create;
try
// first clear the Listbox
Listbox1.clear;
// here we start a new serie
for Times := 1 to StrToInt(Edit3.Text)
do
begin
// we go thru this while-loop until
the max-numbers
// are created. Not every loop
creates an entry
// to the list because double
numbers are ignored.
while MyList.Count <
StrToInt(Edit1.Text) do
begin
// get a new random number
I := Random(Number);
if (I 0) then
begin
// cLen has the number of chars
from max-number plus one
// e.g.
// if max-number is 49 cLen is
3
// if max-number is 111 cLen is
4
// if max-number is 9999 cLen is
5
// this formatting is needed for
the correct
// sorting of all List-Entries
cInt := Format(‘%’ + cLen +
‘.1d’, [I]);
// here we look at double
entries and ignore it
if (MyList.IndexOf(cInt) < -1)
then
continue;
// now we add a new
randomnumber
MyList.Add(cInt);
end;
end;
cInt := ”;
// max-numbers are created now we
sort it
MyList.Sort;
// and put it all into Listbox
for I := 0 to MyList.Count - 1 do
cInt := cInt + MyList.Strings[I];
ListBox1.Items.Add(cInt);
// clear MyList for the next serie
MyList.clear;
end;
finally
MyList.Free;
end;
// make the button enable for the next
click
Self.enabled := True;
end;
type
{array of series of picks, used in Pick
function}
TPick = array of array of integer;
Exemplo de Uso
var
APick: TPick;
begin
APick := Pick (6, 49, 10); {we need 10
series of 6/49 numbers}
…
Canvas.Font.Height:=Canvas.Font.Height*8
div 10;
TextRect(Rect(xx,aRect.Top,xx+TextWidth(te
xt[i]),aRect.Bottom),xx,Y+abs(8*Canvas.Fon
t.Height-10*DefFont.Height) div 10,
text[i]);
inc(xx,TextWidth(text[i]));
end;
TextRect(Rect(xx,aRect.Top,xx+TextWidth(te
xt[i]),aRect.Bottom),xx, Y, text[i]);
inc(xx,TextWidth(text[i]));
end;
if ( superScript ) then
begin
Canvas.Font.Height:=Canvas.Font.Height*9
div 10;
TextRect(Rect(xx,aRect.Top,xx+TextWidth(te
xt[i]),aRect.Bottom),xx, Y-
abs(8*Canvas.Font.Height-
10*DefFont.Height) div 20, text[i]);
inc(xx,TextWidth(text[i]));
end;
Canvas.Font:=DefFont;
end;
end; //for loop
end; // with
DefFont.Free;
end;
Exemplo de uso:
Coloque um Label com propriedade Caption com:
“Formula da Agua H_2O” ou “medida 3000 cm^3”
procedure TForm1.Button1Click(Sender:
TObject);
begin
SuperSubLabelOut(Canvas,ClientRect
,100,100,Label1.Caption);
end;
if PasswordInputBox(‘Senha’,‘Digite sua
senha:’) = ‘123456’ then
ShowMessage(‘Senha Correta’)
else
ShowMessage(‘Senha Errada’);
procedure TForm1.FormResize(Sender:
TObject);
begin
Invalidate;
end;
///////Fim do Código
{ uses ShellApi; }
///////Inicio do Exemplo
///////Fim do Exemplo
Analista/Programador
www.minasexport.com.br
www.cafemokaonline.com.br
801 - Criar Um Programa Para
Transferencia Via Ftp
var
arq : TextFile;
i : Integer;
begin
AssignFile(Arq, ‘nome_arquivo.dat’);
Rewrite(Arq);
Writeln(Arq, ‘open servidor.com.br’);
Writeln(Arq, ‘usuario’);
Writeln(Arq, ‘senha’);
Writeln(Arq, ‘prompt off’);
Writeln(Arq, ‘bin’);
Writeln(Arq, ‘cd caminho arquivo’);
Writeln(Arq, ‘mput arquivo’);
Writeln(Arq, ‘quit’);
CloseFile(Arq);
end;
var
arqbat : TextFile;
begin
AssignFile(Arqbat, ‘Nome_Arquivo.bat’);
Rewrite(Arqbat);
Writeln(Arqbat, ‘ftp -s:Nome_Arquivo.dat’);
CloseFile(Arqbat);
end;
Executando
WinExec(‘command.com /c nome_arquivo.bat’);
AddFontResource(PChar(‘c:\MyFonts\Monospac.ttf’)
);
Screen.Fonts.Add(PChar(‘c:\sgdb\EanBwrP36Tt.ttf’))
;
procedure Tfrm_valida1.FormCreate(Sender:
TObject);
var
MyMenu: TMenuItem;
begin
frm_main.Janela1.Tag := frm_main.Janela1.Tag + 1;
Mymenu := TMenuItem.Create(frm_main.Janela1);
MyMenu.Caption := Caption;
MyMenu.OnClick := FormToFront;
MyMenu.Tag := frm_main.Janela1.Tag;
Tag := MyMenu.Tag;
frm_main.Janela1.Add(MyMenu);
end;
procedure Tfrm_valida1.FormToFront(Sender:
TObject);
begin
BringToFront;
end;
procedure Tfrm_valida1.FormDestroy(Sender:
TObject);
var
I: Integer;
begin
for I := 0 to frm_main.Janela1.Count - 1 do
begin
if frm_main.Janela1.Items[i].Tag = Tag then
begin
frm_main.Janela1.Delete(I);
Break;
end;
end;
end;
procedure TForm1.SpeedButton1Click(Sender:
TObject);
begin
if OpenDialog1.Execute then
edit5.Text := OpenDialog1.FileName;
end;
procedure Tfrm_Manut.bt_backupClick(Sender:
TObject);
var
strArqOrigem, // Nome do arquivo de origem da cópia
strArqDestino: string; // Nome do arquivo de destino
da cópia
wDia,wMes,wAno: Word;
begin
try
// Aciona o indicativo de progresso da cópia
ga_copia.Visible := True;
ga_copia.Progress := 0;
// Monta os nomes de arquivo - Primeiro recupera de
um AdoConnection
// o nome do arquivo a ser copiado
strArqOrigem :=
dm_spark.ADO_Spark.Properties[7].Value;
// Agora vai montar o nome do arquivo de destino.
DecodeDate(Date, wAno, wMes, wDia);
strArqDestino := ‘C:\prodata\copia' +
FormatFloat(‘0000’, WAno);
strArqDestino := strArqDestino + FormatFloat(‘00’,
wMes);
strArqDestino := strArqDestino + FormatFloat(‘00’,
wDia);
strArqDestino := strArqDestino + ‘' +
ExtractFileName(strArqOrigem);
// Desconecta o banco de dados
dm_spark.ADO_Spark.Close;
Repaint;
// Inicia a cópia
CopyFile(strArqOrigem, strArqDestino);
finally
// Reconecta o banco de dados
dm_spark.ADO_Spark.Open;
ga_copia.Visible := False;
end;
end;
Problema:
O problema é que quando chamo a Caixa de Dialogo de
Impressão e escolho um determinado intervalo do
relatório ocorre um erro. Ao invés de ser impresso o
intervalo desejado é impresso o relatório completo. Já
tentei setar de todas as maneiras as propriedades
MaxPage, MinPage, FromPage e ToPage do
componente PrintDialog. Também já tentei setar as
propriedades FirstPage e LastPage de meu componente
QuickReport. Mas a impressão sempre sai completa.
Detalhe: quando seto as propriedades FirstPage e
LastPage do componente QuickRep com o intervalo
desejado em tempo de projeto, o relatório é impresso
corretamente.
Solução:
if PrintDialog1.Execute then
begin
QuickRep1.PrinterSettings.FirstPage :=
PreviewDialog1.FromPage;
QuickRep1.PrinterSettings.LastPage :=
PreviewDialog1.ToPage;
QuickRep1.PrinterSettings.PrinterIndex :=
Printer.PrinterIndex;
QuickRep1.PrinterSettings.Copies := Printer.Copies;
QuickRep1.Print;
end;
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes,
Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
procedure BlockInput(ABlockInput : boolean);
stdcall; external ‘USER32.DLL’;
var
Form1: TForm1;
implementation
{$R *.dfm}
end.
procedure TForm1.CheckListBox1DrawItem(Control:
TWinControl;
Index: Integer; Rect: TRect; State:
TOwnerDrawState);
begin
with (Control as TCheckListBox) do
begin
if Checked[Index] then
Canvas.Font.Color := clRed
else
begin
if Selected[Index] then
Canvas.Font.Color := clWhite
else
Canvas.Font.Color := clBlack;
end;
Canvas.FillRect(Rect);
Canvas.TextOut(Rect.Left, Rect.Top, (Control as
TCheckListBox).Items[Index]);
end;
end;
Vamos as explicações:
Primeiro nós precisamos de um manipulador do tipo
THandle, obtido através da api FindWindow:
GetWindowRect(tmHandle,tmRect);
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Printers;
type
TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
procedure Button1Click(Sender:
TObject);
private
procedure GeraBarrasEAN13(CodBarras:
string; Imagem: TCanvas);
procedure DesenhaBarras(SequenciaHexa:
string; Imagem: TCanvas);
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses UnCriaCodBarrasImpressao;
{$R *.dfm}
//––––––––––––––––––––––––––
//
// .––––––––––––.
// | | Tabela A | Tabela B | Tabela C |
// |–+–––-+–––-+–––-|
// | 0 | 0001101 | 0100111 | 1110010 |
// | 1 | 0011001 | 0110011 | 1100110 |
// | 2 | 0010011 | 0011011 | 1101100 |
// | 3 | 0111101 | 0011011 | 1000010 |
// | 4 | 0100011 | 0011101 | 1011100 |
// | 5 | 0110001 | 0111001 | 1001110 |
// | 6 | 0101111 | 0000101 | 1010000 |
// | 7 | 0111011 | 0010001 | 1000100 |
// | 8 | 0110111 | 0001001 | 1001000 |
// | 9 | 0001011 | 0010111 | 1110100 |
// .––––––––––––.
// Tabela Auxiliar
// .–––––––—.
// | Algarismo | Seqüência |
// |–––—+–––—|
// | 0 | AAAAAA |
// | 1 | AABABB |
// | 2 | AABBAB |
// | 3 | AABBBA |
// | 4 | ABAABB |
// | 5 | ABBAAB |
// | 6 | ABBBAA |
// | 7 | ABABAB |
// | 8 | ABABBA |
// | 9 | ABBABA |
// .–––––––—.
//
// Gerae código de barras padrão EAN13
procedure
TForm1.GeraBarrasEAN13(CodBarras: string;
Imagem: TCanvas);
const
TabelaA: array[0..9] of string[7] =
(‘0001101’, ‘0011001’, ‘0010011’,
‘0111101’, ‘0100011’, ‘0110001’,
‘0101111’, ‘0111011’, ‘0110111’,
‘0001011’);
TabelaB: array[0..9] of string[7] =
(‘0100111’, ‘0110011’, ‘0011011’,
‘0011011’, ‘0011101’, ‘0111001’,
‘0000101’, ‘0010001’, ‘0001001’,
‘0010111’);
TabelaC: array[0..9] of string[7] =
(‘1110010’, ‘1100110’, ‘1101100’,
‘1000010’, ‘1011100’, ‘1001110’,
‘1010000’, ‘1000100’, ‘1001000’,
‘1110100’);
TabAux: array[0..9] of string[6] =
(‘AAAAAA’, ‘AABABB’, ‘AABBAB’, ‘AABBBA’,
‘ABAABB’, ‘ABBAAB’, ‘ABBBAA’, ‘ABABAB’,
‘ABABBA’, ‘ABBABA’);
var
Codigo: string;
Formato: string;
PegaDaTabela: string;
DecimoTerceiroDig: Byte;
Cont: Byte;
begin
Formato := ”;
Codigo := CodBarras;
DecimoTerceiroDig :=
StrToIntDef(CodBarras[1], 0);
{–––––––––––––––––––––––––-}
{ Tendo o 13º dígito definido, posso
definir o padrão de impressão das barras}
{ no primeiro conjunto de 6 dígitos
baseado na tabela Auxiliar. }
{–––––––––––––––––––––––––-}
PegaDaTabela :=
TabAux[DecimoTerceiroDig] + ‘CCCCCC’;
Formato := Formato + ‘101’; //—> Barra
Auxiliar de Guarda ‘Esquerda’
for Cont := 1 to Length(PegaDaTabela) do
begin
case PegaDaTabela[Cont] of
‘A’: Formato := Formato +
TabelaA[StrToInt(Codigo[Cont + 1])];
‘B’: Formato := Formato +
TabelaB[StrToInt(Codigo[Cont + 1])];
‘C’: Formato := Formato +
TabelaC[StrToInt(Codigo[Cont + 1])];
end;
if Cont = 6 then
Formato := Formato + ‘01010’; //—>
Barra Auxiliar de Guarda ‘Central’
end;
Formato := Formato + ‘101’; //—> Barra
Auxiliar de Guarda ‘Direita’
Imagem.Brush.Color := ClWhite;
Imagem.Pen.Color := ClBlack;
x := 10;
i := True;
for y := 1 to Length(SequenciaHexa) do
begin
if SequenciaHexa[y] = ‘0’ then
Imagem.Pen.Color := ClWhite
else
Imagem.Pen.Color := ClBlack;
h := 1;
a.x := x;
a.y := 0;
b.x := x;
b.y := 50;
c.x := x + h - 1;
c.y := 50;
d.x := x + h - 1;
d.y := 0;
case Y of
1..3, 46..50, 93..95:
begin
b.y := 55;
c.y := 55;
end;
end;
Imagem.Polygon([A, B, C, D]);
i := not (i);
x := x + h;
end;
end;
procedure TForm1.Button1Click(Sender:
TObject);
begin
GeraBarrasEAN13(‘7891089060350’,
Image1.Canvas);
end;
keybd_event(VK_CONTROL, 0,
KEYEVENTF_EXTENDEDKEY or 0, 0);
keybd_event(VK_MENU, 0,
KEYEVENTF_EXTENDEDKEY or 0, 0);
keybd_event(VK_DELETE, 0,
KEYEVENTF_EXTENDEDKEY or 0, 0);
{ pressiona Ctrl + Alt(Menu) + Del }
var
bmp: integer;
e faça:
procedure TForm1.StatusBar1DrawPanel(StatusBar:
TStatusBar; Panel: TStatusPanel; const Rect: TRect);
begin
with StatusBar1.Canvas do
begin
FillRect(Rect);
ImageList1.Draw(StatusBar1.Canvas, Rect.Left,
Rect.Top, bmp);
end;
end;
procedure TForm1.Button1…
begin
Arquivo := FileListBox1.FileName; // Variavel recebe
item selecionado no ListBox
MCISendString(PChar(‘Play ‘ + Arquivo), nil, 0, 0);
// Executa variavel ‘Arquivo’
Caption := FormCaption +
ExtractFilename(FileListBox1.Filename); // langa o
nome do arquivo e sua
// extensco como Caption do Form
end;
PS.:
A mesma chamada MCI pode ser usada para Pausar e
Terminar a execução da musica, bastando trocar ‘Play’
por ‘Pause’ e por ‘Stop’.
Localidade: Gravataí - RS
––––––––––––––––––––—
Um colaborador da DTDelphi 2.7
Colabore você com a próxima edição!
824 - Desenhando Em Delphi Via
Programação
procedure TForm1.Button1Click(Sender:
TObject);
var
i: Integer;
SX: Integer;
SY: Integer;
OldBkMode: integer;
begin
SX := ClientWidth;
SY := ClientHeight;
with Canvas do
begin
SY := Trunc(SY / 8); {a procedure
Trunc, transforma um valor do tipo Real em
tipo Inteiro}
for i := 0 to 6 do
begin
Pen.Width := i + 1;
MoveTo(0, (i * SY) + 20);
LineTo(SX, (i * SY) + 20);
end;
Pen.Width := 2;
{Desenhando um Retângulo}
Brush.Color := clGreen;
Rectangle(0, 0, 150, 150);
{Desenhando um outro Retângulo}
Brush.Style := bsDiagCross;
Brush.Color := clRed;
Rectangle(150, 0, 300, 150);
{Desenhando um circulo}
Brush.Style := bsSolid;
Brush.Color := clBlue;
Ellipse(50, 10, 250, 140);
OldBkMode := SetBkMode(Handle,
TRANSPARENT);
TextOut(125, 70, ‘LloydSoft’);
end;
end;
uses Teeprevi;
procedure TForm1.DBGrid1DrawColumnCell(Sender:
TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State:
TGridDrawState);
var
Icon: TBitmap;
begin
Icon := TBitmap.Create;
if (Column.FieldName = ‘SHARES’) then
begin
with DBGrid1.Canvas do
begin
Brush.Color := clWhite;
FillRect(Rect);
if (Table1.FieldByName(‘SHARES’).Value > 4500)
then
ImageList1.GetBitmap(1, Icon)
else
ImageList1.GetBitmap(0, Icon);
Draw(round((Rect.Left + Rect.Right - Icon.Width) /
2), Rect.Top, Icon);
end;
end;
end;
Téc. em Informática
Paulo Afonso - BA
–––––––––––––
Um colaborador da DTDelphi 2.7
Colabore você com a próxima edição!
828 - Checar Se a Url Existe
Téc. em Informática
Paulo Afonso - BA
–––––––––––––
Um colaborador da DTDelphi 2.7
Colabore você com a próxima edição!
829 - Verificar Registros Deletados
No Bde/paradox
Para ver:
VerDeletados(Table1, TRUE);
para esconder:
VerDeletados(Table1, FALSE);
Téc. em Informática
Paulo Afonso - BA
–––––––––––––
Um colaborador da DTDelphi 2.7
Colabore você com a próxima edição!
830 - Contar Todos os Itens e
Subintem de Um Menu
procedure TFrmMenu.GetSubItemMenu(aItemMenu:
TMenuItem);
var
inCountMenu: Integer;
begin
//if aItemMenu.Count > 0 then
for inCountMenu := 0 to aItemMenu.Count - 1 do
begin
GetSubItemMenu(aItemMenu.Items[inCountMenu]);
end;
end;
type
TfrMain = class(TForm)
…
private
procedure
URL_OnDownloadProgress(Sender:
TDownLoadURL;
Progress, ProgressMax: Cardinal;
StatusCode: TURLDownloadStatus;
StatusText: string; var Cancel:
Boolean);
…
implementation
…
procedure TfrMain.URL_OnDownloadProgress;
begin
ProgressBar1.Max := ProgressMax;
ProgressBar1.Position := Progress;
end;
function DoDownload;
begin
with TDownloadURL.Create(self) do
try
URL := ‘http://sua url.com.br’;
FileName := ‘local e o nome que quer
salvar’;
OnDownloadProgress :=
URL_OnDownloadProgress;
ExecuteTarget(nil);
finally
Free;
end;
end;
Onde:
Exemplo:
ADOConnection1.GetTableNames(ListBox1.Items,
False);
Onde:
ADOConnection1.GetFieldNames(‘Funcionarios’,
ListBox1.Items);
1)Excel
2)Html
3)Paradox
4)Dbase
5)Text
unit ExportADOTable;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
Db, ADODB;
type
TExportADOTable = class(TADOTable)
private
{ Private declarations }
//Componente TADOCommand usado para
executar os comandos de exportação SQL
FADOCommand: TADOCommand;
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner:
TComponent); override;
//Procedures de Exportação
//“FieldNames” é uma lista, separada
por vírgula, de nomes dos campos que vc
quer exportar
//“FileName” é o nome do arquivo de
saída (incluindo o path completo)
//Se o dataset é filtrado (Filtered =
true and Filter <> ”), então eu adiciono
//a string de filtro para o comando
sql na diretiva “where”
//Se o dataset ordenado (Sort <> ”)
então eu adiciono a string de ordenação no
comando sql na
//diretiva “order by”
procedure ExportToExcel(FieldNames:
string; FileName: string;
SheetName: string; IsamFormat:
string);
procedure ExportToHtml(FieldNames:
string; FileName: string);
procedure ExportToParadox(FieldNames:
string; FileName: string; IsamFormat:
string);
procedure ExportToDbase(FieldNames:
string; FileName: string; IsamFormat:
string);
procedure ExportToTxt(FieldNames:
string; FileName: string);
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(‘Claudemiro Freitas’,
[TExportADOTable]);
end;
constructor TExportADOTable.Create(AOwner:
TComponent);
begin
inherited;
FADOCommand := TADOCommand.Create(Self);
end;
procedure
TExportADOTable.ExportToExcel(FieldNames:
string; FileName: string;
SheetName: string; IsamFormat: string);
begin
{Valores de IsamFormat
Excel 3.0
Excel 4.0
Excel 5.0
Excel 8.0
}
procedure
TExportADOTable.ExportToHtml(FieldNames:
string; FileName: string);
var
IsamFormat: string;
begin
if not Active then
Exit;
FADOCommand.Connection := Connection;
FADOCommand.CommandText := ‘Select ‘ +
FieldNames + ‘ INTO ‘ + ‘[‘ +
ExtractFileName(FileName) + ‘]’ +
‘ IN ‘ + ‘”’ +
ExtractFilePath(FileName) + ‘”’ + ‘[‘ +
IsamFormat +
‘;]’ + ‘ From ‘ + TableName;
if Filtered and (Filter <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ where ‘ +
Filter;
if (Sort <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ order by ‘ +
Sort;
FADOCommand.Execute;
end;
procedure
TExportADOTable.ExportToParadox(FieldNames
: string;
FileName: string; IsamFormat: string);
begin
{Valores de IsamFormat
Paradox 3.X
Paradox 4.X
Paradox 5.X
Paradox 7.X
}
if not Active then
Exit;
FADOCommand.Connection := Connection;
FADOCommand.CommandText := ‘Select ‘ +
FieldNames + ‘ INTO ‘ + ‘[‘ +
ExtractFileName(FileName) + ‘]’ +
‘ IN ‘ + ‘”’ +
ExtractFilePath(FileName) + ‘”’ + ‘[‘ +
IsamFormat +
‘;]’ + ‘ From ‘ + TableName;
if Filtered and (Filter <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ where ‘ +
Filter;
if (Sort <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ order by ‘ +
Sort;
FADOCommand.Execute;
end;
procedure
TExportADOTable.ExportToDbase(FieldNames:
string; FileName: string;
IsamFormat: string);
begin
{Valores de IsamFormat
dBase III
dBase IV
dBase 5.0
}
if not Active then
Exit;
FADOCommand.Connection := Connection;
FADOCommand.CommandText := ‘Select ‘ +
FieldNames + ‘ INTO ‘ + ‘[‘ +
ExtractFileName(FileName) + ‘]’ +
‘ IN ‘ + ‘”’ +
ExtractFilePath(FileName) + ‘”’ + ‘[‘ +
IsamFormat +
‘;]’ + ‘ From ‘ + TableName;
if Filtered and (Filter <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ where ‘ +
Filter;
if (Sort <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ order by ‘ +
Sort;
FADOCommand.Execute;
end;
procedure
TExportADOTable.ExportToTxt(FieldNames:
string; FileName: string);
var
IsamFormat: string;
begin
if not Active then
Exit;
IsamFormat := ‘Text’;
FADOCommand.Connection := Connection;
FADOCommand.CommandText := ‘Select ‘ +
FieldNames + ‘ INTO ‘ + ‘[‘ +
ExtractFileName(FileName) + ‘]’ +
‘ IN ‘ + ‘”’ +
ExtractFilePath(FileName) + ‘”’ + ‘[‘ +
IsamFormat +
‘;]’ + ‘ From ‘ + TableName;
if Filtered and (Filter <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ where ‘ +
Filter;
if (Sort <> ”) then
FADOCommand.CommandText :=
FADOCommand.CommandText + ‘ order by ‘ +
Sort;
FADOCommand.Execute;
end;
end.
{
Note que você pode usar um database
existente como destino mas não uma tabela
existente no seu database
Se você especificar uma tabela existente
você vai receber uma mensagem de erro.
program ADOdemo;
uses
Forms,
uMain in ‘uMain.pas’ {frmMain};
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TfrmMain,
frmMain);
Application.Run;
end.
//////////////////////////////////////////
/////////////////////////
unit uMain;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
Db, DBTables, ADODB, Grids, DBGrids,
ExtCtrls, DBCtrls, StdCtrls, Buttons,
ComObj;
type
TfrmMain = class(TForm)
DBGridUsers: TDBGrid;
BitBtnClose: TBitBtn;
DSource1: TDataSource;
EditTextBox: TEdit;
BitBtnAdd: TBitBtn;
TUsers: TADOTable;
BitBtnRefresh: TBitBtn;
Timer1: TTimer;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure
ConnectToAccessDB(lDBPathName,
lsDBPassword: string);
procedure
ConnectToMSAccessDB(lsDBName,
lsDBPassword: string);
procedure AddRecordToMSAccessDB;
function CheckIfAccessDB(lDBPathName:
string): Boolean;
function GetDBPath(lsDBName: string):
string;
procedure BitBtnAddClick(Sender:
TObject);
procedure BitBtnRefreshClick(Sender:
TObject);
procedure Timer1Timer(Sender:
TObject);
function GetADOVersion: Double;
procedure Button1Click(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmMain: TfrmMain;
Global_DBConnection_String: string;
const
ERRORMESSAGE_1 = ‘Nenhum Database
Selecionado’;
ERRORMESSAGE_2 = ‘Acesso Inválido ao
Database’;
implementation
{$R *.DFM}
procedure TfrmMain.FormCreate(Sender:
TObject);
begin
ConnectToMSAccessDB(‘ADODemo.MDB’,
‘123’); // DBName,DBPassword
end;
procedure
TfrmMain.ConnectToMSAccessDB(lsDBName,
lsDBPassword: string);
var
lDBpathName: string;
begin
lDBpathName := GetDBPath(lsDBName);
if (Trim(lDBPathName) <> ”) then
begin
if CheckIfAccessDB(lDBPathName) then
ConnectToAccessDB(lDBPathName,
lsDBPassword);
end
else
MessageDlg(ERRORMESSAGE_1,
mtInformation, [mbOK], 0);
end;
function TfrmMain.GetDBPath(lsDBName:
string): string;
var
lOpenDialog: TOpenDialog;
begin
lOpenDialog := TOpenDialog.Create(nil);
if
FileExists(ExtractFileDir(Application.ExeN
ame) + ‘' + lsDBName) then
Result :=
ExtractFileDir(Application.ExeName) + ‘' +
lsDBName
else
begin
lOpenDialog.Filter := ‘MS Access DB|’
+ lsDBName;
if lOpenDialog.Execute then
Result := lOpenDialog.FileName;
end;
end;
procedure
TfrmMain.ConnectToAccessDB(lDBPathName,
lsDBPassword: string);
begin
Global_DBConnection_String :=
‘Provider=Microsoft.Jet.OLEDB.4.0;’ +
‘Data Source=’ + lDBPathName + ‘;’ +
‘Persist Security Info=False;’ +
‘Jet OLEDB:Database Password=’ +
lsDBPassword; //Senha do MDB
with TUsers do
begin
ConnectionString :=
Global_DBConnection_String;
TableName := ‘Users’;
Active := True;
end;
end;
function
TfrmMain.CheckIfAccessDB(lDBPathName:
string): Boolean;
var
UnTypedFile: file of Byte;
Buffer: array[0..19] of Byte;
NumRecsRead: Integer;
i: Integer;
MyString: string;
begin
AssignFile(UnTypedFile, lDBPathName);
reset(UnTypedFile, 1);
BlockRead(UnTypedFile, Buffer, 19,
NumRecsRead);
CloseFile(UnTypedFile);
for i := 1 to 19 do
MyString := MyString +
Trim(Chr(Ord(Buffer[i])));
Result := False;
if Mystring = ‘StandardJetDB’ then
Result := True;
if Result = False then
MessageDlg(ERRORMESSAGE_2,
mtInformation, [mbOK], 0);
end;
procedure TfrmMain.BitBtnAddClick(Sender:
TObject);
begin
AddRecordToMSAccessDB;
end;
procedure TfrmMain.AddRecordToMSAccessDB;
var
lADOQuery: TADOQuery;
lUniqueNumber: Integer;
begin
if Trim(EditTextBox.Text) <> ” then
begin
lADOQuery := TADOQuery.Create(nil);
with lADOQuery do
begin
ConnectionString :=
Global_DBConnection_String;
SQL.Text :=
‘SELECT Number from Users’;
Open;
Last;
// Gera um número único
(AutoNumeração no Access)
lUniqueNumber := 1 +
StrToInt(FieldByName(‘Number’).AsString);
Close;
// Insere Registro no MSAccess DB
usindo SQL
SQL.Text :=
‘INSERT INTO Users Values (‘ +
IntToStr(lUniqueNumber) + ‘,’ +
QuotedStr(UpperCase(EditTextBox.Te
xt)) + ‘,’ +
QuotedStr(IntToStr(lUniqueNumber))
+ ‘)’;
ExecSQL;
Close;
// Isso atualiza o Grid
Automaticamente
Timer1.Interval := 5000;
Timer1.Enabled := True;
end;
end;
end;
procedure
TfrmMain.BitBtnRefreshClick(Sender:
TObject);
begin
Tusers.Active := False;
Tusers.Active := True;
end;
procedure TfrmMain.Timer1Timer(Sender:
TObject);
begin
Tusers.Active := False;
Tusers.Active := True;
Timer1.Enabled := False;
end;
procedure TfrmMain.Button1Click(Sender:
TObject);
begin
ShowMessage(Format(‘Versão do ADO = %n’,
[GetADOVersion]));
end;
end.
{
Author: Michael Casse
Tradução: Claudemiro Freitas
}
SetHorizontalScrollBox(Nome_do_seu_listbox);
Enviada por: Andréa Santos Figueiredo
Aracaju-SE
–––––––––––––
Uma colaboradora da DTDelphi 2.7
Colabore você com a próxima edição!
837 - Simulando Checkbox Em
Dbgrid
procedure TForm1.DBGrid1DrawColumnCell(Sender:
TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State:
TGridDrawState);
var
R: TRect;
begin
{pinta checkbox}
if Column.Field = ClientDataSet1ATIVO then
begin
DBGrid1.Canvas.FillRect(Rect);
ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 10,
Rect.Top + 1, 0);
if ClientDataSet1ATIVO.AsBoolean then
ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 10,
Rect.Top + 1, 2)
else
ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 10,
Rect.Top + 1, 1);
end;
end;
procedure TForm1.DBGrid1CellClick(Column:
TColumn);
begin
if Column.Field = ClientDataSet1ATIVO then
begin
ClientDataSet1.Edit;
ClientDataSet1ATIVO.AsBoolean := not
ClientDataSet1ATIVO.AsBoolean;
end;
end;
procedure TForm1.DBGrid1ColEnter(Sender:
TObject);
begin
if DBGrid1.SelectedField = ClientDataSet1ATIVO
then
DBGrid1.Options := DBGrid1.Options - [dgEditing]
else
DBGrid1.Options := DBGrid1.Options +
[dgEditing];
end;
Enviada por: Renato Arcon Gaio
procedure TForm1.DBGrid1DrawColumnCell(Sender:
TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State:
TGridDrawState);
var
R: TRect;
begin
{pinta checkbox}
if Column.Field = ClientDataSet1ATIVO then
begin
DBGrid1.Canvas.FillRect(Rect);
ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 10,
Rect.Top + 1, 0);
if ClientDataSet1ATIVO.AsBoolean then
ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 10,
Rect.Top + 1, 2)
else
ImageList1.Draw(DBGrid1.Canvas, Rect.Left + 10,
Rect.Top + 1, 1);
end;
end;
procedure TForm1.DBGrid1CellClick(Column:
TColumn);
begin
if Column.Field = ClientDataSet1ATIVO then
begin
ClientDataSet1.Edit;
ClientDataSet1ATIVO.AsBoolean := not
ClientDataSet1ATIVO.AsBoolean;
end;
end;
procedure TForm1.DBGrid1ColEnter(Sender:
TObject);
begin
if DBGrid1.SelectedField = ClientDataSet1ATIVO
then
DBGrid1.Options := DBGrid1.Options - [dgEditing]
else
DBGrid1.Options := DBGrid1.Options +
[dgEditing];
end;
Enviada por: Marcelo Otone Aguiar
parametros da procedure:
listtemp2:Tstrings;
listtemp2 := TstringList.Create;
exemplo:
coloca-se um listbox, e um button no form.
depois declara-se a variavel global no form
ex:
var
Form1: TForm;
listtemp2: TStrings;
interface
uses
Windows, Messages, SysUtils, Variants,
Classes, Graphics,
Controls, Forms, Dialogs, StdCtrls,
Menus, Grids, DBGrids,
DB, DBTables, ExtCtrls, DBCtrls,
Buttons;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
Button1: TButton;
BitBtn1: TBitBtn;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
DataSource1: TDataSource;
Table1: TTable;
Table1CAMPO: TStringField;
Table1SEQUENCIA: TStringField;
Table1ORDEM: TStringField;
Table1FLAG: TBooleanField;
Table1CAMPO01: TStringField;
Table1CAMPO02: TStringField;
Table1CAMPO03: TStringField;
Table1CAMPO04: TStringField;
Table1CAMPO05: TStringField;
Table1FLAG01: TBooleanField;
Table1FLAG02: TBooleanField;
Table1FLAG03: TBooleanField;
Table1FLAG04: TBooleanField;
Table1FLAG05: TBooleanField;
procedure Button1Click(Sender:
TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender:
TObject);
var
NewItem: TMenuItem;
X, I, K: integer;
XCampo: string;
XFlag: Boolean;
begin
Table1.First;
K := Table1SEQUENCIA.AsInteger;
while (K <= 1000) and not Table1.Eof do
begin
K := Table1SEQUENCIA.AsInteger;
NewItem :=
TMenuItem.Create(MainMenu1);
try
NewItem.Caption :=
Table1CAMPO.Value;
NewItem.Enabled := Table1FLAG.Value;
MainMenu1.Items.Add(NewItem);
except
NewItem.Free;
raise; { reraise the exception }
end;
Table1.Next;
I := K;
while (I = K) and not Table1.Eof do
begin
NewItem := TMenuItem.Create(Self);
try
NewItem.Caption :=
Table1CAMPO.Value;
NewItem.Enabled :=
Table1FLAG.Value;
MainMenu1.Items[K -
1].Add(NewItem);
X := 1;
while (X <= 5) do
begin
XCampo := ”;
XFlag := False;
if (X = 1) then
begin
XCampo := Table1CAMPO01.Value;
XFlag := Table1FLAG01.Value;
end
else if (X = 2) then
begin
XCampo := Table1CAMPO02.Value;
XFlag := Table1FLAG02.Value;
end
else if (X = 3) then
begin
XCampo := Table1CAMPO03.Value;
XFlag := Table1FLAG03.Value;
end
else if (X = 4) then
begin
XCampo := Table1CAMPO04.Value;
XFlag := Table1FLAG04.Value;
end
else if (X = 5) then
begin
XCampo := Table1CAMPO05.Value;
XFlag := Table1FLAG05.Value;
end;
if XCampo <> ” then
begin
NewItem :=
TMenuItem.Create(Self);
try
NewItem.Caption := XCampo;
NewItem.Enabled := XFlag;
MainMenu1.Items[K -
1].Items[Table1ORDEM.AsInteger -
1].Add(NewItem);
except
NewItem.Free;
raise; { reraise the
exception }
end;
end;
Inc(X);
end;
except
NewItem.Free;
raise; { reraise the exception }
end;
Table1.Next;
K := Table1SEQUENCIA.AsInteger;
end;
end;
end;
end.
uses jpeg;
Exemplo de Uso
ARQUIVO: teste.pas
––––––––––––––––––-
program teste;
uses windows,sysutils,classes,forms,stdctrls;
constructor tfrm.create(aowner:tcomponent);
begin
inherited create(aowner);
left:=(screen.width div 2)-width div 2;
top:=(screen.height div 2)-height div 2;
end;
procedure tfrm.button1click(sender:tobject);
begin
if button1.caption = ‘Clique’ then
button1.caption:=‘Aperte’
else
button1.caption:=‘Clique’;
end;
{$R *.dfm}
begin
application.initialize;
application.createform(tfrm,frm);
application.run;
end.
––––––––––––––––––-
ARQUIVO: teste.dfm
––––––––––––––––––-
object frm: tfrm
width = 350
height = 290
caption = ‘programa teste’
object button1: tbutton
caption = ‘Clique’
left = 20
top = 20
width = 100
height = 30
onclick = button1click
end
end
––––––––––––––––––-
dcc32 teste
unit Form_Menu;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics,
Controls, Forms, Dialogs,
Menus, DB, ComCtrls, ExtCtrls, StdCtrls, Buttons,
Mask, DBTables,
DBIPROCS, DBITypes, DBIErrs, Gauges, ImgList,
ToolWin, jpeg, ExtDlgs;
type
TFrm_Menu = class(TForm)
MainMenu1: TMainMenu;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Frm_Menu: TFrm_Menu;
implementation
//––––––––––––//
//…Rotina de manipulaco de erros //
//––––––––––––//
procedure TFrm_Menu.ManipulaExcecoes(Sender:
TObject; E: Exception);
var
BitMap: TBitmap;
begin
//…Captura e salva a tela atual do erro.
BitMap := TBitmap.Create;
BitMap := CaptureScreenRect(Bounds(0, 0,
Screen.Width, Screen.Height));
BitMap.SaveToFile(ExtractFilePath(Application.Exe
Name) + ‘erro.bmp’);
BitMap.Free;
{$R *.DFM}
procedure TFrm_Menu.FormCreate(Sender: TObject);
begin
Application.OnException := ManipulaExcecoes;
end;
end.
Um exemplo simples
type
TMeuThread = class(TThread)
x: integer;
posx, posy: integer;
numero: integer;
procedure execute; override;
procedure contador;
constructor MeuConstrutor(x, y, numthread:
integer);
destructor destroy; override;
private
public
end;
create {constructor}
destroy {destructor}
constructor TMeuThread.MeuConstrutor(x, y,
numthread: integer);
begin
Create(false); {como definimos nosso construtor
personalizado, solicitamos que seja criada a classe
atraves do construtor padrão e então utilizamos os
métodos que definimos.
O valor (false) refere-se a forma do construtor:
constructor create(createsuspended:boolean);
O qual criará a thread em modo suspenso, ou seja,
devemos iniciar a execução da thread chamando o
metodo tthread.resume; }
freeonterminate := true; {“matar” este objeto
(TMeuThread) quando a thread terminar sua execução}
posx := x; {posicao left de onde imprimiremos o texto
da thread}
posy := y; {posicao top de onde imprimiremos o texto
da thread}
numero := numthread; {numero da thread em
execução}
end;
procedure TMeuThread.execute;
begin
while not terminated do {equanto thread em
execucao…}
begin
synchronize(contador); {chamar o procedimento
contador. Utilize a chamada synchronize quando não
estiver certo de que não haverá mais de uma thread em
execução.}
sleep(10); {aguarde 10 milisegundos e entao
continue o processo. Assim evitamos o uso de 100% do
processador e ainda damos tempo a nossa aplicação
para que processe as mensagens do windows (no nosso
caso, wm_paint)}
end;
end;
public
Thread: TMeuThread;
…
Coloque um TButton em seu formulário, dê um clique
duplo nele (para acessar o evento OnButtonClick).
Então coloque o seguinte código:
var
NomeDoLog: string;
Arquivo: TextFile;
begin
NomeDoLog := ChangeFileExt(Application.Exename,
‘.log’);
AssignFile(Arquivo, NomeDoLog);
if FileExists(NomeDoLog) then
Append(arquivo) { se existir, apenas adiciona linhas
}
else
ReWrite(arquivo); { cria um novo se não existir }
try
WriteLn(arquivo, DateTimeToStr(Now) + ‘:’ +
E.Message);
WriteLn(arquivo, ‘–––––––––––––––––––––––-‘);
Application.ShowException(E);
finally
CloseFile(arquivo)
end;
end;
Onde:
myFileName = Nome do Arquivo a ser criado
myDataSet = Nome da tabela ou descendente
Modo de usar:
SaveAsCSV(‘TabelaClientes’, tblClientes);
if Win32Plataform = VER_PLATAFORM_WIN32_NT
then
WinExec(‘cmd /c netsh interface ip set
address”Conexão local” DHCP’,
SW_SHOWNORMAL)
else
MessageBox(Handle, ‘esse Comando não pode ser
rodado fora da plataforma NT’, ‘NETSH’,
MB_ICONWARNING);
Geral
Calorias Exemplo de como fazer a comunicação entre
dois ListBox
CooCalc Uma calculadora “Pauleira!”
CursorMemo Como obter a posição do cursor em um
componente TMemo
Combinação Exemplo de como retornar o item de um
Combobox
DifData Como obter a diferença entre duas Datas e
Duas horas
Distancia Exemplo de como obter a distância em
metros.
Lista Exemplo de como inserir um item em um
listbox
Marquee Exemplo de como criar um Banner controlado
Selecao Exemplo de como Selecionar um item de um
listbox
SomaMes Exemplo de como somar meses à uma data
especificada
Ultdia Exemplo de como obter o último dia do mês
Mirror Exemplo de um Espelho muito “Doidão”
Calendar Exemplo de um Calendário muito bom
QuickReport Varios exemplos para você fazer relatórios
com o QuickReport
Relatorios Como trabalhar com relatorios via QuickReport
ou Tprinter
NewCal Como chamar uma calculadora
CgiDelphi Exemplo de como usar CGI no delphi
DDE Como fazer dois programas se comunicarem
entre si
HoraSeg Como converter horas em segundos e
segundos em horas
Mensagens Programa de manipulação de mensagens em
rede
CriaComp Como criar um componente em tempo de
execução
Relógio Um Relogio Bacana
CombSgrid Como inserir um ComboBox dentro de um
StringGrid
RunTime Como mover um componente em Run-Time
ScrolList Como colocar um ScrollBar em um
componente ListBox.
FTP Exemplo de um FTP com Delphi
TreeView Como usar um panel no estilo Windows
Explorer
Parser Como enviar o conteúdo de um Edit para um
MEMO
DragDrop Exemplo do método DragDrop
DragDropDem Outro exemplo do método DragDrop
DragDrop1 Outro bom exemplo de como usar o Evento
Drag’n Drop
DragDrop3 Outro bom exemplo de como usar o Evento
Drag’n Drop
DragDropTB Exemplo de como arrastar um botão para a
Barra de ferramentas
MacroSubst Exemplo de Macrosubstituição
Chat Exemplo de chat
Calculadora Um bom exemplo de Calculadora
CodeApp Um utilitário para manipular código fonte
pascal
Cryt Exemplo de um encriptador de dados
DemoCursor Exemplo de como manipular os cursores do
mouse
FlyToolBar Exemplo de como criar uma barra de tarefas
flutuante
Install Exemplo de como criar um programinha de
instalação
LinColMemo Exemplo de como obter linha e coluna em um
Memo
MenuEx97 Exemplo de como fazer um menu igual ao do
Office 97
Register Exemplo de como não permitir que seu demo
rode fora do Delphi
SpeedButton Um bom exemplo com os SpeedButons
Forms
Exemplo de como fazer um banner em um
LabelMovel
form
Exemplo de como passar parâmetros de um
ParametForm
form para outro
Como manipular variaveis entre dois ou mais
VarInvisible
forms
FormDinamic Como criar formulários dinamicos
Exemplo de como colar no form, uma figura da
ClipBoard
area de transferência
DibTest Exemplo de como criar um Form Exótico
Como colocar um bitmap lado a lado no fundo
BitmpaForm
de um form
Exemplo de como bloquear o
RestrictSize
redimensionamento do Form
CircleForm Exemplo de como criar um form circular
FrameForm Exemplo de como colocar frames em um form
Exemplo de como desenhar um poígono em
Poligon
um form
Exemplo de como criar um menu PopUp em
PopUp
um form
DifLinhas Exemplo de como desenhar linhas no form
Como colocar um Bitmap no fundo do Form
FormBitmap
pela API do Windows
Outro exemplo de como colocar um Bitmap no
TBitmaPlus
fundo do Form
Como suspender a animação de minimizar e
FormTake
maximizar o form
Exemplo de como copiar o Form para a área
CopyClipBrd
de transferência
MoveForm Exemplo de como mover um form clicando em
qualquer lugar nele
ScreenSBit Exemplo de como carregar Bitmpas no Form
Como criar um Form que role na tela
RolupForm
semelhante à uma persiana
Exemplo de como criar um cubo rotatório no
RotateCube
form
Como obter posições de figuras no form com o
Region
mouse
Exemplo de como desenhar ondas senoidais
SineWave
no Form
Arquivos
Sistema
Empresa Como obter o nome do usuário registrado no
windows
TaskList Exemplo de como criar uma lista de tarefas
Como obter os Drives do computador em um
TipoDrv
componente TMemo
Como obter dados da CPU em um
WindFlag
componente TMemo
Exemplo de como enviar mensagems para o
WinMsg
Windows
Como obter os recursos do sistema (Acho que
ResWatch
só roda no Delphi 3)
CriaGrupo Como criar grupo de programa e ícones
SysInfo Exemplo de como obter os dados do sistema
Exemplo de como trocar automaticamente a
ChangeRes
resoluçào do vídeo
CpuIdent Exemplo de como obter dados da CPU
CriaAtalho Exemplo de como criar um atalho no Windows
Exemplo de como Testar a velocidade de um
DiskBeench
drive
MapMemory Exemplo de como A memoria é mapeada
Exemplo de como testar uma porta serial em
PortTest
seu computador
Exemplo de como enviar mensagens para o
SendMessage
Windows
Serial D1 Como obter o numero serial do HD no Delphi 1
Tabelas
Variáveis
Gráficos
Outros