Eu tambem tinha essas duvidas. E, do mesmo jeito que voce, so tinha uma vaga compreensao 
do primeiro.

Entao, vamos por partes.
DIM
Define matrizes.
Sintaxe: DIM matriz(indice) as TIPO

Oi, Pedro

No Qbasic, existem as variaveis. Mas, vamos supor que voce queira fazer um editor de 
textos que gravasse o texto somente depois de digitado. Entao teriamos que criar 
variaveis para armazenar cada linha. Exemplo: l1$, l2$, l3$. Claro que assim o numero de 
linhas ficaria bastante limitado, pois teriamos que criar uma variavel para cada linha.
Mas, com o DIM, a gente pode criar uma variavel multipla.
ex.:
DIM a(2)

Entao, ao inves de termos a variavel A, temos A(0), A(1), A(2). Temos varios A.
Aparentemente inutil. Qual eh a diferenca entre ter uma variavel dividida em tres e ter 
tres variaveis?

Vamos supor o seguinte programa:
READ A0$
READ A1$
READ A2$

Ate que nao eh muito trabalhoso, sao so tres linhas.
E se fossem 225?
Voce nao poderia fazer o seguinte programa:

FOR I = 1 to 255
READ aI$
NEXT

Porque o QB entenderia que aI$ eh o nome de uma variavel, enquanto a sua intencao eh 
substituir esse I pelo valor de I mesmo, para ficar a1$, a2$, a3$

Mas se...:

DIM a$(255)    'Divide a$ em 225 parttes
FOR I = 1 to 255
READ a(I)$     'Agora da, pois existe a(1), a(2), a(3)
NEXT

Bom, nao foi uma explicacao muito boa, mas espero que entenda. Eu expliquei para outra 
pessoa como se usava o DIM, mas perdi o e-mail.
OBS.: Por que antes de usar GET deve-se usar o DIM.
Simples. O que o GET faz eh capturar uma imagem, ponto por ponto. Entao, grava cada 
ponto na variavel (quer dizer, matriz). 


O TYPE
Eu demorei mais tempo para descobrir como se usa o type. Pois o Help do Qbasic ensina 
mal, e ainda por cima traz um exemplo errado. Para descobrir como se usa o type eu tive 
que pesquisar intensamente o programa Balloon-X, de 66K (!!). Mas descobri.


O TYPE serve para definir tipos de variaveis.


Vc ja viu algum programa com alguma variavel que contenha um ponto? Na maioria
daz vezes, essas variaveis com ponto foram definidas com Type.
Ex.:

Pessoa.Idade

Eh como se Pessoa fosse uma variavel e Idade fosse uma subvariavel, ou seja,
uma variavel dentro de Pessoa.
Como um diretorio (ou pasta) e seus arquivos. Eh como se Pessoa fosse um
diretorio. Dentro desse diretorio existem arquivos, como eh o caso de Idade.
Para criar esse Pessoa.Idade usa-se o seguinte

TYPE PessoaType     'PessoaType eh um TIPO
Idade  AS INTEGER
Altura AS INTEGER
Peso   AS INTEGER
END TYPE

Criamos o tipo PessoaType. Mas num programa, nos nao usaremos
PessoaType.Idade, PessoaType.Altura ou PessoaType.Peso. 
Pois PessoaType eh um tipo. Sim, um tipo, assim como DOUBLE eh um tipo,
INTEGER eh um tipo, etc.
Entao, como definimos que uma variavel eh de um tipo (double, single, etc.)?
Usamos o DIM, como vc mesmo sabe.
Entao seria:

DIM Pessoa as PessoaType

Pronto. A variavel Pessoa nao eh do tipo texto, nem de precisao dupla,
nem nada. Pessoa eh do tipo PessoaType. Meio estranho, nao? Mas eh assim
mesmo. E que tipo eh esse? O tipo PessoaType eh, na verdade, uma coletanea de
tipos. No caso, tres INTEGERs (Idade, Peso e Altura).
Entao o programa esta assim ate agora:

TYPE PessoaType     'PessoaType eh um TIPO
Idade  AS INTEGER
Altura AS INTEGER
Peso   AS INTEGER
END TYPE
DIM Pessoa as PessoaType

Entao podemos fazer Pessoa.Idade, Pessoa.Altura e Pessoa.Peso
Ate agora, meio inutil, nao?
Mas e se colocassemos:

DIM Pessoa(10) as Nomes

Pronto. Agora temos Pessoa(0).Peso, Pessoa(1).Peso, Pessoa(2).Peso,...
                    Pessoa(0).Idade, Pessoa(1).Idade, Pessoa(2).Idade,...
                    Pessoa(0).Altura, Pessoa(1).Altura, Pessoa(2).Altura,...

Ou seja, a cada Pessoa, atribuimos um Peso, uma Idade e uma Altura.

Esse abaixo e' um programa que eu fiz, que mostra um outro exemplo do TYPE.


DEFINT A-Z

SCREEN 7
OPTION BASE 1

'Def
DEF fnr (n) = INT(RND * n)

'Types
TYPE Stars
C AS INTEGER
X AS INTEGER
Y AS INTEGER
END TYPE

'Dims
DIM Star(300) AS Stars
DIM C(300) AS Stars
DIM X(300) AS Stars
DIM Y(300) AS Stars


RANDOMIZE TIMER
'Generating Random Stars
FOR i = 1 TO 300
r = fnr(2)
SELECT CASE r
 CASE 0
  cor = 7
 CASE 1
  cor = 8
 CASE 2
  cor = 15
END SELECT
rx = fnr(320)
ry = fnr(200)
PSET (rx, ry), cor
Star(i).X = rx
Star(i).Y = ry
Star(i).C = cor
NEXT i

SLEEP


DO
'Moving Stars
Move:
FOR i = 1 TO 300
    FOR t = 1 TO 500: NEXT t
PSET (Star(i).X, Star(i).Y), 0
IF Star(i).X >= 160 THEN Star(i).X = Star(i).X + 3
IF Star(i).X < 160 THEN Star(i).X = Star(i).X - 3
IF Star(i).Y <= 100 THEN Star(i).Y = Star(i).Y - 3
IF Star(i).Y > 100 THEN Star(i).Y = Star(i).Y + 3

IF Star(i).Y < 100 THEN Star(i).Y = Star(i).Y - 3

'Drawing
IF Star(i).X > 320 THEN Star(i).X = fnr(320): Star(i).Y = fnr(200)
IF Star(i).X < 0 THEN Star(i).X = fnr(320): Star(i).Y = fnr(200)
IF Star(i).Y > 200 THEN Star(i).Y = fnr(320): Star(i).Y = fnr(200)
IF Star(i).Y < 0 THEN Star(i).Y = fnr(320): Star(i).Y = fnr(200)

PSET (Star(i).X, Star(i).Y), Star(i).C
NEXT i
LOOP


1