Variablen vom Typ Record in einer dynamischen Liste verwalten

August 6, 2010 - Lesezeit: ~1 Minute
unit MerkRecord;

interface

uses Classes,Variants;

type
  // Dieser Rekord soll in der Liste enthalten sein
  TMerkRecord = Record
    I :integer;
    s :string;
    v : Variant;
    a :array of char;
  End;

  // die eigentliche Liste
  TMerkList = class(TList)
  private
    function GetItems(index: integer): TMerkRecord;
  protected
    // Freigabe des Speichers
    procedure Notify(Ptr: Pointer; Action: TListNotification); override;
  public
    // Zugriff auf den Rekord
    property Items[index :integer] :TMerkRecord read GetItems; default;
    // Neuen Record hinzufügen
    function Add(R :TMerkRecord) :integer;
  end;

implementation

type
  PMerkRecord = ^TMerkrecord;

{ TMerkList }

function TMerkList.Add(R: TMerkRecord): integer;
var
  P :PMerkRecord;
begin
  P:= new(PMerkRecord);
  P^:=R;
  Result:=inherited Add(P);
end;

function TMerkList.GetItems(index: integer): TMerkRecord;
begin
 Result:=PMerkRecord(inherited Items[Index])^;
end;

{Strings und dynamische Arrays müssen auf die Länge von 0 gesetzt werden.
 Da Variants alle Typen enthalten können, müssen sie auf NULL gesetzt werden}

procedure TMerkList.Notify(Ptr: Pointer; Action: TListNotification);
begin
  if Action=lnDeleted then begin
    PMerkRecord(Ptr).s:='';
    PMerkRecord(Ptr).V:=Null;
    SetLength(PMerkRecord(Ptr).a,0);
    Dispose(Ptr);
  end;
  inherited;
end;

end.
Tags: Delphi Delphi 2009

Im Internet gefunden ...

August 4, 2010 - Lesezeit: ~1 Minute

Ich habe im Internet einen Emulator für meinen 2. Rechner (Z1013) gefunden. Sogar eines meiner ersten Programme war dabei.
Wir hatten damals schon FreewareLachanfall

Z1013

Tags:

DevGrid 6: nur Jahre in Filterbox

Juli 21, 2010 - Lesezeit: ~1 Minute

Beim Filtern einer Column mit Datumswerten sollen nur die Jahre angezeigt werden

Filter aktiv

Dadurch ist auch eine Mehrfachauswahl möglich. dafür sind 2 Schritte notwendig: Es müssen die Events OnGetFilterValues und OnInitFilteringDateRanges genutzt werden


procedure THWFilter.OnInitFilteringDateRanges(Sender: TcxCustomGridTableItem; ADateRanges: TcxGridDateRanges);
begin
  ADateRanges.Add(TcxGridYearRange); // nach Jahren filtern
end;

procedure THWFilter.OnGetFilterValues(Sender: TcxCustomGridTableItem; AValueList: TcxDataFilterValueList);
var
  z: integer;
begin
  // löschen der einzelnen Tage
  for z := AValueList.Count - 1 downto 0 do
    if AValueList[z].Kind = fviValue then
      AValueList.Delete(z);
end;
Tags: Delphi Delphi 2009 DevGrid

Arduino Duemilanove unter Linux

Juli 6, 2010 - Lesezeit: ~1 Minute

Transfer mit arvdude

avrdude -p m328p -P /dev/ttyUSB0 -c arduino -D -b57600 -U flash:w:[Dateiname]:i

 

Start Simulator simavr

run_avr -m atmega328p -f 16000000 /usr/share/arduino/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex Datei.hex 

der Bootloader "/usr/share/arduino/hardware/arduino/bootloaders/atmega/ATmegaBOOT_168_atmega328.hex" kann weggelassen werden.

 

AVR Assembler mit Geany programmieren

Tags: Linux Arduino Duemilanove

Testen, ob der String eine Integer-Zahl darstellt

Juni 16, 2010 - Lesezeit: ~1 Minute

Diese Prozedur gibt 1 zurück falls s eine Zahl ist ansonsten eine 0.


CREATE PROCEDURE ISZAHL (S VARCHAR (100))
RETURNS (ISZAHL SMALLINT)
AS 
declare variable l integer;
declare variable i integer;
declare variable c char(1);
BEGIN
  l=char_length(s);
  if (s is null or l=0) then
    ISZAHL=0;
  else begin
    i=1;
    ISZAHL=1;
    while (i<=l and ISZAHL=1) do begin
      c=substring(S from i for 1);
      if (c between '0' and '9' or (i=1 and c in ('+','-'))) then
        i=i+1;
      else
        ISZAHL=0;
    end
  end
  SUSPEND;
END
Tags: Firebird SQL

Linux-Server mit Ubuntu 10.04 und der Power-Schalter

Mai 2, 2010 - Lesezeit: ~1 Minute

Nach dem Upgrade auf Ubuntu 10.04 Serveredition funktionierte das Ausschalten des Servers mit dem Power-Button nicht mehr. Das Paket acpid ist installiert.

 

Die Ausgabe von acpi_listen beim drücken des Schalters war auch ok:

 button/power PWRF 00000080 00000001

In der Datei
/etc/acpi/events/powerbtn
enthielt auch die richtige Definition des Events. Der manuelle Aufruf der dazugehörenden Datei mit
sudo /etc/acpi/powerbtn
zum Test brachte dann eine Fehlermeldung. Diese Datei nutzt Funktionen eines Paketes, das in der Serveredition nicht installiert ist (acpi-support).

Lösung:
Erstellung einer neuen Datei /etc/acpi/powerbtn_server.sh
#!/bin/sh
# /etc/acpi/powerbtn_server.sh
# Initiates a shutdown when the power putton has been
# pressed.
/sbin/shutdown -h now "Power button pressed"
Anschließend wird die Datei etc/acpi/events/powerbtn geändert:
event=button[ /]power
action=/etc/acpi/powerbtn_server.sh

 

Update: Mit den Update vom 5.5.2010 ist dieser Fehler beseitigt.

Tags: Ubuntu Linux 10.04 Server