wmuokkaa.pas
wmuokaaa.pas - WinAapisen muokkausohjelma
unit muokkaap;
{-------------------------------------------------------------------------------
Modulin tarkoituksena on muokata WinAapisen tietokantaa
Tekijä: Vesa Lappalainen
Aika: 22.7.1996
Delphi-versio: 1.0 & 2.0
Muutokset: 4.8.1996/vl
+ gridiin pudotus toimii Win 3.1:ssäkin (vika oli siinä
että (y shl 16) oli 0 16-bittisessä Windowsissa.
Korjaus: (longint(y) shl 16)
+ taso välille (ennen vain pienempi kuin yläraja)
WinAapisen tietokanta (WAapi.db) on muotoa:
--------------------------------------------------
|kirjain|nro|ääni |kuva |sana |
--------------------------------------------------
| A |1 |auto.wav |auto.bmp |auto |
| A |2 |aapinen.wav| |aapinen |
| B |1 |banaani.wav|banaani.bmp |banaani |
--------------------------------------------------
Tällä ohjelmalla käsitellään tietokantaa.
Tietokantaan voidaan raaháta uusia äänitiedostoja tai kuvatiedostoja
tiedostolistoista. Samalla voidaan koekuunnella ääniä ja katsella
kuvia.
Tietokannasta voidaan valita rajoitettu joukko nähtäväksi joko
kirjoittamalla itse SQL:n where-haluehto tai valitsemalla
mitä kirjainta tai (/ja) tasoa (=nro) halutaan tutkia.
Uutta tietuetta lisättäessä ehdotetaan numeroksi lisättävää
kirjainta vastaava seuraava suurempi numero. Esim. edellä
jos tietokannassa olisi kuvan 3 riviä, ehdotettaisiin uudelle
A:lle numeroa 3, uudelle B:lle numeroa 2 ja uudelle H:lle numeroa 1.
-------------------------------------------------------------------------------}
interface
uses
{Windows,} WinProcs,
Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
DB, DBCtrls, ExtCtrls, Grids, DBGrids, DBTables, StdCtrls, FileCtrl, Mask,
MPlayer;
type
TFormMuokkaa = class(TForm)
{ Näkymättömät komponentit ------------------------------------------------}
QueryMuokkaa: TQuery;
QueryMuokkaakirjain: TStringField;
QueryMuokkaaNro: TFloatField;
QueryMuokkaaKuva: TStringField;
QueryMuokkaaSana: TStringField;
QueryMuokkaaAani: TStringField;
DataSourceMuokkaa: TDataSource;
QueryMax: TQuery;
QueryMaxmaxnro: TFloatField;
SaveDialogWav: TSaveDialog;
{ -------------------------------------------------------------------------}
PanelNappulat: TPanel; { --------------------------------------------------}
GroupBoxValinnat: TGroupBox;
LabelValinnatKirjain: TLabel;
EditKirjain: TMaskEdit;
CheckBoxAnd: TCheckBox;
LabelValinnatTaso: TLabel;
EditTaso: TMaskEdit;
Label_: TLabel;
EditTaso2: TMaskEdit;
GroupBoxOptiot: TGroupBox;
CheckBoxSiirra: TCheckBox;
CheckBoxSoita: TCheckBox;
CheckBoxEditoi: TCheckBox;
GroupBoxTyhja: TGroupBox;
GroupBoxValittu: TGroupBox;
LabelKirjain: TLabel;
DBEditKirjain: TDBEdit;
LabelNro: TLabel;
DBEditNro: TDBEdit;
LabelSana: TLabel;
DBEditSana: TDBEdit;
{ PanelNappulat -----------------------------------------------------------}
PanelGrid: TPanel; {-------------------------------------------------------}
PanelHaku: TPanel;
LabelWhere: TLabel;
EditHaku: TEdit;
ButtonHae: TButton;
DBNavigatorMuokkaa: TDBNavigator;
DBGridMuokkaa: TDBGrid;
{ PanelGrid ---------------------------------------------------------------}
PanelListWav: TPanel;
PanelFilterWav: TPanel;
FilterComboBoxWav: TFilterComboBox;
FileListBoxWav: TFileListBox;
PanelListBmp: TPanel;
PanelFilterBmp: TPanel;
FilterComboBoxBmp: TFilterComboBox;
FileListBoxBmp: TFileListBox;
PanelEditointiJaBmp: TPanel; {---------------------------------------------}
GroupBoxNauhoitus: TGroupBox;
DBEditWavNimi: TDBEdit;
ButtonSiirraWav: TButton;
EditWav: TEdit;
ButtonUusiWav: TButton;
MediaPlayerWav: TMediaPlayer;
ButtonSaveWav: TButton;
GroupBoxKuvaTiedot: TGroupBox;
DBEditBmpNimi: TDBEdit;
ButtonSiirraBmp: TButton;
EditBmp: TEdit;
ButtonTyhjennaBmp: TButton;
MediaPlayerAvi: TMediaPlayer;
GroupBoxKuva: TGroupBox;
PanelImage: TPanel; { Jotta kuvalle saadaan maxkoko, Align = alClient }
ImageBmp: TImage; { Align = alNone }
{ PanelEditointiJaBmp -----------------------------------------------------}
procedure EditKirjainChange(Sender: TObject); { Samalla myös tasolle }
procedure EditKirjainClick(Sender: TObject);
procedure CheckBoxAndClick(Sender: TObject);
procedure ButtonHaeClick(Sender: TObject);
procedure EditHakuEnter(Sender: TObject);
procedure EditHakuExit(Sender: TObject);
procedure FileListBoxWavChange(Sender: TObject);
procedure FileListBoxBmpChange(Sender: TObject);
procedure FileListBoxWavDblClick(Sender: TObject);
procedure FileListBoxBmpDblClick(Sender: TObject);
procedure FileListBoxWavKeyPress(Sender: TObject; var Key: Char);
procedure FileListBoxBmpKeyPress(Sender: TObject; var Key: Char);
procedure DBGridMuokkaaDblClick(Sender: TObject);
procedure DataSourceMuokkaaDataChange(Sender: TObject; Field: TField);
procedure DBEditWavNimiDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure DBEditBmpNimiDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure DBGridMuokkaaDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
procedure DBEditWavNimiDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure DBEditBmpNimiDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure DBGridMuokkaaDragDrop(Sender, Source: TObject; X, Y: Integer);
procedure CheckBoxEditoiClick(Sender: TObject);
procedure DBGridMuokkaaColExit(Sender: TObject);
procedure ButtonSiirraWavClick(Sender: TObject);
procedure ButtonSaveWavClick(Sender: TObject);
procedure ButtonUusiWavClick(Sender: TObject);
procedure ButtonSiirraBmpClick(Sender: TObject);
procedure ButtonTyhjennaBmpClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
EdellinenEhto : integer; { Apu jotta And-ehdon poistuessa tiedetään mikä }
{ ehto laitetaan aktiiviseksi }
function Maxnro(s:string):integer;
procedure TeeHaku;
procedure TeeEhtoJaHaku(kuka:integer);
function WavListBoxName:String;
function BmpListBoxName:String;
function LaitaWavNimi(nimi:string):boolean;
function LaitaBmpNimi(nimi:string):boolean;
function Soita(nimi:string):integer;
function Nayta(nimi:string):integer;
function SoitaWavList:integer;
function NaytaBmpList:integer;
function AcceptDropWav(Source:TObject):boolean;
function AcceptDropBmp(Source:TObject):boolean;
function DropNameWav(Source:TObject):string;
function DropNameBmp(Source:TObject):string;
public
{ Public declarations }
end;
var
FormMuokkaa: TFormMuokkaa;
implementation
uses ali;
{$R *.DFM}
{------------------------------------------------------------------------------}
function TFormMuokkaa.Maxnro(s:string):integer;
begin
QueryMax.Close;
QueryMax.Params[0].AsString := s;
QueryMax.Open;
Maxnro := QueryMaxMaxnro.AsInteger;
end;
{------------------------------------------------------------------------------}
{ Hakuehdon käsittelyyn liittyvät apuohjelmat }
{------------------------------------------------------------------------------}
procedure TFormMuokkaa.TeeHaku;
begin
QueryMuokkaa.Close; QueryMuokkaa.SQL.Clear;
QueryMuokkaa.SQL.Add('select * from WAapi where ' +EditHaku.text);
QueryMuokkaa.Open;
end;
procedure TFormMuokkaa.ButtonHaeClick(Sender: TObject);
begin
TeeHaku;
end;
procedure TFormMuokkaa.EditHakuEnter(Sender: TObject);
begin
ButtonHae.Default := true;
end;
procedure TFormMuokkaa.EditHakuExit(Sender: TObject);
begin
ButtonHae.Default := false;
end;
{------------------------------------------------------------------------------}
procedure TFormMuokkaa.TeeEhtoJaHaku(kuka:integer);
{ Rakennetaan hakuehto sen perusteella kuka kutsuu ja onko And päällä
Hakuehdoksi tulee joko:
kirjain="K" - ei and-haku, haku kirjaimen perusteella
kirjain>="" - ei and-haku ja kirjain tyhjä
nro<9 - ei and-haku ja tason perusteella
kirjain="K" and nro<9 - and-haku
-------------------------------------------------------------------------------}
{ Sisäiset apufunktiot ehtojen muodostamiseen }
function EhtoKirjain:string;
begin
EhtoKirjain := 'Kirjain="'+EditKirjain.text+'"';
if ( EditKirjain.Text <= ' ') then
EhtoKirjain := 'Kirjain>=" "';
end;
function EhtoTaso:string;
begin
EhtoTaso := EditTaso.text+' <= Nro and Nro <= '+EditTaso2.text;
end;
{------------------------------------------------------------------------------}
begin { TeeEhtoJaHaku }
EdellinenEhto := kuka;
case kuka of
0: EditHaku.Text := EhtoKirjain;
1: EditHaku.Text := EhtoTaso;
end;
if ( CheckBoxAnd.checked ) then
EditHaku.Text := EhtoKirjain + ' and ' + EhtoTaso;
TeeHaku;
end;
procedure TFormMuokkaa.EditKirjainChange(Sender: TObject);
begin
TeeEhtoJaHaku((Sender as TMaskEdit).tag);
(Sender as TMaskEdit).SelectAll;
end;
procedure TFormMuokkaa.EditKirjainClick(Sender: TObject);
begin
EdellinenEhto := (Sender as TMaskEdit).tag;
(Sender as TMaskEdit).SelectAll;
end;
procedure TFormMuokkaa.CheckBoxAndClick(Sender: TObject);
begin
TeeEhtoJaHaku(EdellinenEhto);
end;
{------------------------------------------------------------------------------}
{ Tiedoston soittamisen ja näyttämisen apuohjelmat: }
{------------------------------------------------------------------------------}
function TFormMuokkaa.Soita(nimi:string):integer;
begin
EditWav.text := nimi;
Soita := SoitaTiedosto(nimi,MediaPlayerWav);
end;
function TFormMuokkaa.Nayta(nimi:string):integer;
begin
EditBmp.text := nimi;
Nayta := NaytaTiedosto(nimi,ImageBmp,MediaPlayerAvi);
end;
function TFormMuokkaa.WavListBoxName:String;
begin
WavListBoxName := ExtractFileName(FileListBoxWav.FileName);
end;
function TFormMuokkaa.BmpListBoxName:String;
begin
BmpListBoxName := ExtractFileName(FileListBoxBmp.FileName);
end;
function TFormMuokkaa.SoitaWavList:integer;
begin
SoitaWavList := Soita(WavListBoxName);
end;
function TFormMuokkaa.NaytaBmpList:integer;
begin
NaytaBmpList := Nayta(BmpListBoxName);
end;
function TFormMuokkaa.LaitaWavNimi(nimi:string):boolean;
begin
LaitaWavNimi := false;
if ( nimi = '*' ) then exit;
LaitaWavNimi := true;
QueryMuokkaa.Edit;
QueryMuokkaaAani.AsString := nimi;
Soita(nimi);
end;
function TFormMuokkaa.LaitaBmpNimi(nimi:string):boolean;
begin
LaitaBmpNimi := false;
if ( nimi = '*' ) then exit;
LaitaBmpNimi := true;
QueryMuokkaa.Edit;
QueryMuokkaaKuva.AsString := nimi;
end;
{------------------------------------------------------------------------------}
{ Tapahtumia joista joko näytetään tai soitetaan, mahdollisesti siirretään }
{ nimi tietokantaan: }
procedure TFormMuokkaa.FileListBoxWavDblClick(Sender: TObject);
begin
if ( QueryMuokkaaAani.AsString <= '' ) or ( CheckBoxSiirra.Checked ) then
LaitaWavNimi(WavListBoxName);
SoitaWavList;
end;
procedure TFormMuokkaa.FileListBoxBmpDblClick(Sender: TObject);
begin
if ( QueryMuokkaaKuva.AsString <= '' ) or ( CheckBoxSiirra.Checked ) then
LaitaBmpNimi(BmpListBoxName);
end;
procedure TFormMuokkaa.FileListBoxWavChange(Sender: TObject);
begin
if ( CheckBoxSoita.Checked ) then SoitaWavList;
end;
procedure TFormMuokkaa.FileListBoxBmpChange(Sender: TObject);
begin
NaytaBmpList;
end;
procedure TFormMuokkaa.FileListBoxWavKeyPress(Sender: TObject; var Key: Char);
begin
if ( Key = #13 ) then
if ( DataSourceMuokkaa.State in [dsEdit] ) then
LaitaWavNimi(WavListBoxName)
else
Soita(WavListBoxName);
end;
procedure TFormMuokkaa.FileListBoxBmpKeyPress(Sender: TObject; var Key: Char);
begin
if ( Key = #13 ) then
if ( DataSourceMuokkaa.State in [dsEdit] ) then
LaitaBmpNimi(BmpListBoxName)
end;
procedure TFormMuokkaa.DBGridMuokkaaDblClick(Sender: TObject);
begin
Soita(QueryMuokkaaAani.AsString);
Nayta(QueryMuokkaaKuva.AsString);
end;
procedure TFormMuokkaa.DataSourceMuokkaaDataChange(Sender: TObject;
Field: TField);
begin
if ( CheckBoxSoita.Checked ) then Soita(QueryMuokkaaAani.AsString);
Nayta(QueryMuokkaaKuva.AsString);
end;
{------------------------------------------------------------------------------}
{ Drag and drop rutiinit: }
{------------------------------------------------------------------------------}
{ Ensin apufunktioita, ettei tarvitse kirjoittaa kaikkea monta kertaa: }
function TFormMuokkaa.AcceptDropWav(Source:TObject):boolean;
begin
AcceptDropWav := ( Source = FileListBoxWav ) or ( Source = EditWav );
end;
function TFormMuokkaa.AcceptDropBmp(Source:TObject):boolean;
begin
AcceptDropBmp := ( Source = FileListBoxBmp ) or ( Source = ImageBmp) or
( Source = EditBmp );
end;
function TFormMuokkaa.DropNameWav(Source:TObject):string;
begin
DropNameWav := '*';
if ( Source = FileListBoxWav ) then DropNameWav := WavListBoxName;
if ( Source = EditWav ) then DropNameWav := EditWav.text;
end;
function TFormMuokkaa.DropNameBmp(Source:TObject):string;
begin
DropNameBmp := '*';
if ( Source = FileListBoxBmp ) then DropNameBmp := BmpListBoxName;
if ( Source = ImageBmp) or ( source = EditBmp ) then
DropNameBmp := EditBmp.text;
end;
{ Sitten varsinaiset tapahtumat: ----------------------------------------------}
procedure TFormMuokkaa.DBEditWavNimiDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := AcceptDropWav(Source);
end;
procedure TFormMuokkaa.DBEditBmpNimiDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := AcceptDropBmp(Source);
end;
procedure TFormMuokkaa.DBGridMuokkaaDragOver(Sender, Source: TObject;
X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := AcceptDropWav(Source) or AcceptDropBmp(Source);
end;
procedure TFormMuokkaa.DBEditWavNimiDragDrop(Sender, Source: TObject;
X, Y: Integer);
begin
LaitaWavNimi(DropNameWav(Source));
end;
procedure TFormMuokkaa.DBEditBmpNimiDragDrop(Sender, Source: TObject;
X, Y: Integer);
begin
LaitaBmpNimi(DropNameBmp(Source));
end;
{------------------------------------------------------------------------------}
procedure TFormMuokkaa.DBGridMuokkaaDragDrop(Sender, Source: TObject;
X, Y: Integer);
var lparam:longint;
bmp,wav : string;
begin
{ Talletetaan nimet, koska ne muuttuvat tietokannan rivin muuttuessa }
wav := DropNameWav(Source); { HUOM! Voi tulla *, joka jatkossa hylätään }
bmp := DropNameBmp(Source); { - " - }
{ Vaihdetaan tietokanta pudotetulle riville lähettämällä MouseClick-viesti }
DBGridMuokkaa.SelectedIndex := 0;
lparam := {x or }(longint(y) shl 16); { x=0 jottei siirrä saraketta }
SendMessage(DBGridMuokkaa.handle,WM_LBUTTONDOWN,0,lparam);
SendMessage(DBGridMuokkaa.handle,WM_LBUTTONUP,0,lparam);
LaitaWavNimi(wav); { HUOM! Vähintään toinen on aina * eikä siis }
LaitaBmpNimi(bmp); { laitetakaan! }
end;
{------------------------------------------------------------------------------}
{ Muita tapahtumia: }
{------------------------------------------------------------------------------}
procedure TFormMuokkaa.CheckBoxEditoiClick(Sender: TObject);
begin
DataSourceMuokkaa.AutoEdit := CheckBoxEditoi.Checked;
end;
procedure TFormMuokkaa.DBGridMuokkaaColExit(Sender: TObject);
{ Jos lisätään uusi tietue, etsitään nro:ksi valmiiksi suurin+1 }
begin
if ( DataSourceMuokkaa.State in [dsInsert] ) and
( QueryMuokkaaNro.AsString <= '' ) and
( QueryMuokkaaKirjain.AsString > '' )then
QueryMuokkaaNro.AsInteger := Maxnro(QueryMuokkaaKirjain.AsString)+1;
end;
{------------------------------------------------------------------------------}
{ Äänen nauhoitukseen liittyvät rutiinit: }
{------------------------------------------------------------------------------}
procedure TFormMuokkaa.ButtonSiirraWavClick(Sender: TObject);
begin
LaitaWavNimi(EditWav.text);
end;
procedure TFormMuokkaa.ButtonSaveWavClick(Sender: TObject);
begin
if ( MediaPlayerWav.mode = mpNotReady ) then exit;
if ( EditWav.text <= ' ' ) then
SaveDialogWav.FileName := QueryMuokkaaAani.AsString
else
SaveDialogWav.FileName := EditWav.text;
if ( NOT SaveDialogWav.execute ) then exit;
MediaPlayerWav.Filename := SoitaNimi(SaveDialogWav.FileName);
MediaPlayerWav.Save;
EditWav.text := ExtractFileName(SaveDialogWav.FileName);
end;
procedure TFormMuokkaa.ButtonUusiWavClick(Sender: TObject);
begin
MediaPlayerWav.Close;
MediaPlayerWav.Filename := 'tyhjawav.wav';
MediaPlayerWav.Open;
EditWav.text := '';
end;
{------------------------------------------------------------------------------}
{ Kuvan käsittelyyn liittyvät rutiinit: }
{------------------------------------------------------------------------------}
procedure TFormMuokkaa.ButtonSiirraBmpClick(Sender: TObject);
begin
LaitaBmpNimi(EditBmp.text);
end;
procedure TFormMuokkaa.ButtonTyhjennaBmpClick(Sender: TObject);
begin
Nayta('');
end;
{------------------------------------------------------------------------------}
{ Lomakkeen luonnissa tehtävät toimenpiteet: }
procedure TFormMuokkaa.FormCreate(Sender: TObject);
begin
QueryMuokkaa.Active := True;
TeeHaku;
end;
end.