Gå til innhold

Delphi, Pascal og Kylix Kodesnutter


Anbefalte innlegg

Tenkte at vi her i Delphi forumet også burde ha en tråd for kodesnutter som andre kan ha bruk for.

 

Reglene for tråden er enkle; ingen diskusjon, bare pasting av kode med evt kommentarer til hva som ble pasta. Ønsker du/dere å diskutere noe fra tråden anbefaler jeg å lage en tråd dedikert til dette.

 

HUSK!

Ikke ta æren for koden du finner her. Hvis du bruker koden i et prosjekt vær vennelig å gi opphavsmann credits, hvis ikke annet er nevnt.

 

Pasta litt fra invictus sin tråd i c++ forumet.

 

Denne koden får Form2 til å dukke opp på oppgavelinjen.

type
 TForm2 = class(TForm)
   procedure CreateParams(var params: TCreateParams); override;

procedure TForm2.CreateParams(var params: TCreateParams);
begin
 inherited CreateParams(params);
 params.ExStyle := params.ExStyle or WS_EX_APPWINDOW;
 params.WndParent := GetDesktopwindow;
end;

Credit: Peter Below (TeamB)

 

Søkefunksjon i ListView:

function FindAndSelectItems(lv: TListView; const S: string; column: Integer;
 WholeWord: boolean): boolean;

var
 i: Integer;
 found: Boolean;
 lvItem: TListItem;

begin
 Assert(Assigned(lv));
 Assert((lv.ViewStyle = vsReport) or (column = 0));
 Assert(S <> '');
 for i := 0 to lv.Items.Count - 1 do
   begin
     lvItem := lv.Items[i];
   if column = 0 then
     begin
       if WholeWord then
         found := AnsiCompareText(lvItem.Caption, S) = 0
       else
         if pos(s, lvItem.Caption) > 0 then
           found := true
         else
           found := false;
     end
   else if column > 0 then
     begin
       if lvItem.SubItems.Count >= Column then
         begin
           if WholeWord then
             found := AnsiCompareText(lvItem.SubItems[column - 1], S) = 0
           else
             if pos(s, lvItem.SubItems[column - 1]) > 0 then
               found := true
             else
               found := false;
         end
       else
         found := False;
       end
       else
         found := False;
         result := found;
   if found then
     begin
       lv.Selected := lvItem;
     end;
 end;
end;

Endret av gerri28
Lenke til kommentar
  • 4 uker senere...
Videoannonse
Annonse

Syntes det høres ut som en god idé, jeg... Men det burde vel egentlig fått et separat forum, siden det ville vært mye mer organisert og mye mer oversiktlig.

 

Uansett, her er en prosedyre som laster inn tekst fra en ressurs-dll:

 

procedure LoadTextFromResource(ResLibPath, TextID: string; Strings: TStrings);
var
 ResLib: THandle;
 ResStream: TResourceStream;
begin
 try
   ResLib := LoadLibrary(ResLibPath);
   if ResLib <> 0 then begin
     ResStream := TResourceStream.Create(ResLib, TextID, RT_RCDATA);
     ResStream.Position := 0;
     Strings.LoadFromStream(ResStream);
     ResStream.Free;
   end else MessageDlg('Failed to load resource library.', mtError, [mbOk], 0);
 finally
   FreeLibrary(ResLib);
 end;
end;

Lenke til kommentar
  • 1 måned senere...

For å få Windows XP skygge på formen:

 

 

type
TForm2 = class(TForm)
  procedure CreateParams(var params: TCreateParams); override;


procedure TForm2.CreateParams(var Params: TCreateParams);
const
 CS_DROPSHADOW = $20000;
begin
 inherited;
  Params.Style := WS_POPUP;
  Params.WindowClass.style := Params.WindowClass.style or CS_DROPSHADOW;
end;

Endret av Zoxc
Lenke til kommentar

Her er et par måter å fjerne flimring i programmer der du bruker GDI mye. Den første er bruken av dobbel bufring. Konseptet med dobbel bufring er å først tegne bildet i usynlig minne, for så å enten gjøre det minnet synlig eller kopiere fra det usynlige minnet til det synlige minnet. Det er faktisk utrolig enkelt å gjøre det i Delphi:

 

procedure TForm1.Create(Sender: TObject);
begin
 DoubleBuffered := True;
end;

 

Husk at denne verdien kun er tilgjengelig fra Delphi 4 og oppover, og å bruke denne kommandoen vil også gjøre at programmet bruker littegranne mer minne.

 

Måte nummer 2: gjør kontrollen ugjennomsiktig. Da vil Delphi skjønne at bakgrunnen ikke skal slettes, siden den er ugjennomsiktig, og siden det ville føre til flimring. Dette ville for såvidt funke dårlig på kontroller som faktisk har gjennomsiktighet.

 

procedure TForm1.Create(Sender: TObject);
begin
 ControlStyle := ControlStyle + [csOpaque];
end;

 

Den siste jeg vet om er en måte som funker utrolig bra til å redusere flimring, nemlig å ta seg av WM_ERASEBKGND-beskjeden. Windows sender denne beskjeden når bakgrunnen til et vindu skal slettes. Men om du planlegger å tegne over hele bakgrunnen, blir det bare masse unødvendig flimring på grunn av dette. Så, under private-direktivet i klassen som inneholder formen din, legger du til denne lille kodesnutten:

 

procedure StopFlicker(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;

 

Deretter legger du til selve prosedyren under implementation, som ganske enkelt ser slik ut:

 

procedure TForm1.StopFlicker(var Msg: TWMEraseBkgnd);
begin
 Msg.Result := 1;
end;

 

Der har du 3 fine måter å gjøre din jobb enklere på når du skriver grafiske programmer :yes:

 

Kan være verdt å nevne at stort sett all denne informasjonen har jeg lært fra delphi.about.com. Hvis dere vil finne ut mer om dette her, anbefaler jeg at dere sjekker den siden.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...