2017-02-09 2 views
-1

Hallo, EveryBody!Delphi: Wie man alle Bilder von der Server-Datenbank erhält, indem man App-Anbinden verwendet?

Ich habe Client- und Server.

Ich benutze Delphi-xe8. App -> Multi-Device Application

BeideClient- und Server verwenden App-Tethering, SQLite-Datenbank.

Wenn Server Hinzufügen von Bild-Datenbank, es perfekt ist das Hinzufügen,

Server Side

aber in einer Client-Seite, wenn Client-Klick "Get Bildliste" Taste. Client Erhalten Sie nur ein Bild [Ich möchte alle Bilder].

Client Side

1. quation: Wie Alle Bilder von Server-Datenbank auf Client-Datenbank zu erhalten. durch App-Tethering [SendStream]? Ich denke, Problem mit AResource.Value.AsStream muss zu Splite, How ... ???

2. Quation: Wie kopiert man alle Bilder aus der Server-Datenbank und speichert sie auf dem vom Client erstellten Ordner [Client \ db \ images]?

Kunde 'Get Bildliste' Button Code:

procedure TForm1.GetImgBtnClick(Sender: TObject); 
begin 
tAProfile.SendString(tManager.RemoteProfiles.First,'GetImages','get'); 
end; 

Server Side:

procedure TForm2.tAProfileResourceReceived(const Sender: TObject; 
    const AResource: TRemoteResource); 
    var 
    MS:TMemorystream; 
begin 
if AResource.Hint='GetImages' then 
     begin 
     MS:=TMemorystream.Create; 
     // ShowMessage(AResource.Value.AsString); // msg from client 'get' 

     while not rQuery.Eof do 
      begin 
      tblobField(rQuery.FieldByName('image')).SaveToStream(MS1); 
      Image1.Bitmap:=nil; // Если не занулить будет ошибка 
     // Image1.bitmap.LoadFromStream(MS); 
      rQuery.Next; 
      end; 
      tAProfile.SendStream(tManager.RemoteProfiles.First,'SendImages',MS); //Sending Images to Client MS 
     end; 
end; 

Client Side:

procedure TForm1.tAProfileResourceReceived(const Sender: TObject; 
    const AResource: TRemoteResource); 
begin 
if AResource.Hint='SendImages' then 

    begin 

    // Image1.Bitmap.LoadFromStream(AResource.Value.AsStream); 

    rQuery.Insert; 
    TBlobField(rQuery.FieldByName('image')).LoadFromStream(AResource.Value.AsStream); 
    rQuery.Post; 
    end; 

end; 
+0

Verwenden Sie nur das generische Delphi-Tag und das ** einzelne ** spezifische Versions-Tag für die von Ihnen verwendete Delphi-Version. Hinzufügen von allen von ihnen (einschließlich mehrere, die ** nicht unterstützen Tethering ** ist einfach lächerlich. –

+0

Ich werde jetzt korrigieren. –

Antwort

3

Wie erhalten Sie alle Bilder von der Server-Datenbank mithilfe von App-Tethering?

Eigentlich ist das sehr einfach zu tun, so wie ich es unten getan habe.

Ich hoffe, dass Ihre Anwendungen mit den beiden unten durch einen Vergleich, werden Sie in der Lage sein , um herauszufinden, was Sie tun müssen, um zu bekommen Ihr richtig oder zu arbeiten, wenn nicht, ist es zumindest könnte Ihre q verfeinern helfen sich auf das genaue Problem konzentrieren.

Um zu verhindern, dass Ihre Daten hier nicht verfügbar sind und die Verwendung von FMX und Live Bindings (und wie Sie sie verwenden) in die Quere kommen, stütze ich meine Apps auf den BioLife.CDS Daten finden Sie in Ihrem Delphi Samples/Data-Ordner.Ich Basis den Code der beiden Anwendungen auf Malcolm Groves Tutorial hier

http://www.malcolmgroves.com/blog/?p=1854

und in beiden Apps Ich habe eine ClientDataSet, Datasource, DBGrid, DBNavigator und DBImage in jeder App, genau verbunden, wie Sie würde erwartet in einer minimalen db-aware-101-Anwendung.

Das Anbinden Mechanismus sendet die erste CDS-Daten der App auf die zweite Anwendung als ein Strom, der TClientDataSet SaveToStream und LoadFromStream Methoden.

Die beiden Apps funktionierten zum ersten Mal mit Null Debugging.

App1 Code:

TApp1Form = class(TForm) 
    TetheringManager1: TTetheringManager; 
    TetheringAppProfile1: TTetheringAppProfile; 
    DBImage1: TDBImage; 
    btnConnect: TButton; 
    Label1: TLabel; 
    CDS1: TClientDataSet; 
    CDS1SpeciesNo: TFloatField; 
    CDS1Category: TStringField; 
    CDS1Common_Name: TStringField; 
    CDS1SpeciesName: TStringField; 
    CDS1Lengthcm: TFloatField; 
    CDS1Length_In: TFloatField; 
    CDS1Notes: TMemoField; 
    CDS1Graphic: TGraphicField; 
    DataSource1: TDataSource; 
    DBGrid1: TDBGrid; 
    DBNavigator1: TDBNavigator; 
    btnSendStream: TButton; 
    [...] 
    end; 

    [...] 

procedure TApp1Form.btnConnectClick(Sender: TObject); 
begin 
    TetheringManager1.AutoConnect; 
end; 

procedure TApp1Form.btnSendStreamClick(Sender: TObject); 
begin 
    CDSToStream; 
end; 

procedure TApp1Form.FormCreate(Sender: TObject); 
begin 
    CDS1.Open; 
    Caption := Format('App1 : %s', [TetheringManager1.Identifier]); 
end; 

procedure TApp1Form.TetheringManager1PairedToRemote(const Sender: TObject; const 
    AManagerInfo: TTetheringManagerInfo); 
begin 
    Label1.Caption := Format('Connected : %s %s', 
         [AManagerInfo.ManagerIdentifier, 
          AManagerInfo.ManagerName]); 
end; 

procedure TApp1Form.CDSToStream; 
var 
    Stream : TMemoryStream; 
begin 
    Stream := TMemoryStream.Create; 
    CDS1.SaveToStream(Stream); 
    Stream.Position := 0; 
    TetheringAppProfile1.Resources.FindByName('BioLife').Value := Stream; 
end; 

Client-Code:

type 
    TFmxApp2Form = class(TForm) 
    CDS1: TClientDataSet; 
    DataSource1: TDataSource; 
    ImageControl1: TImageControl; 
    BindingsList1: TBindingsList; 
    BindNavigator1: TBindNavigator; 
    BindSourceDB1: TBindSourceDB; 
    LinkControlToField2: TLinkControlToField; 
    TetheringManager1: TTetheringManager; 
    TetheringAppProfile1: TTetheringAppProfile; 
    StringGrid1: TStringGrid; 
    Label1: TLabel; 
    CDS1SpeciesNo: TFloatField; 
    CDS1Category: TStringField; 
    CDS1Common_Name: TStringField; 
    CDS1SpeciesName: TStringField; 
    CDS1Lengthcm: TFloatField; 
    CDS1Length_In: TFloatField; 
    CDS1Notes: TMemoField; 
    CDS1Graphic: TGraphicField; 
    LinkGridToDataSource1: TLinkGridToDataSource; 
    procedure TetheringAppProfile1ResourceReceived(const Sender: TObject; const 
     AResource: TRemoteResource); 
    procedure TetheringManager1PairedFromLocal(const Sender: TObject; const 
     AManagerInfo: TTetheringManagerInfo); 
    private 
    end; 
[...] 
procedure TFmxApp2Form.TetheringAppProfile1ResourceReceived(const Sender: TObject; 
    const AResource: TRemoteResource); 
begin 
    AResource.Value.AsStream.Position := 0; 
    CDS1.LoadFromStream(AResource.Value.AsStream); 
end; 

procedure TFmxApp2Form.TetheringManager1PairedFromLocal(const Sender: TObject; const 
    AManagerInfo: TTetheringManagerInfo); 
begin 
Label1.Text := Format('Connected : %s %s', 
         [AManagerInfo.ManagerIdentifier, 
         AManagerInfo.ManagerName]); 
end; 

Client-DFM

object FmxApp2Form: TFmxApp2Form 
    [...] 
    object ImageControl1: TImageControl 
    Bitmap.PNG = {} 
    object BindNavigator1: TBindNavigator 
    [...] 
    DataSource = BindSourceDB1 
    end 
    object StringGrid1: TStringGrid 
    [...] 
    end 
    object Label1: TLabel 
    [...] 
    end 
    object CDS1: TClientDataSet 
    Aggregates = <> 
    FieldDefs = < 
     item 
     Name = 'Species No' 
     DataType = ftFloat 
     end 
     item 
     Name = 'Category' 
     DataType = ftString 
     Size = 15 
     end 
     item 
     Name = 'Common_Name' 
     DataType = ftString 
     Size = 30 
     end 
     item 
     Name = 'Species Name' 
     DataType = ftString 
     Size = 40 
     end 
     item 
     Name = 'Length (cm)' 
     DataType = ftFloat 
     end 
     item 
     Name = 'Length_In' 
     DataType = ftFloat 
     end 
     item 
     Name = 'Notes' 
     DataType = ftMemo 
     Size = 50 
     end 
     item 
     Name = 'Graphic' 
     DataType = ftGraphic 
     end> 
    IndexDefs = <> 
    Params = <> 
    StoreDefs = True 
    Left = 40 
    Top = 32 
    object CDS1SpeciesNo: TFloatField 
     FieldName = 'Species No' 
    end 
    object CDS1Category: TStringField 
     FieldName = 'Category' 
     Size = 15 
    end 
    object CDS1Common_Name: TStringField 
     FieldName = 'Common_Name' 
     Size = 30 
    end 
    object CDS1SpeciesName: TStringField 
     FieldName = 'Species Name' 
     Size = 40 
    end 
    object CDS1Lengthcm: TFloatField 
     FieldName = 'Length (cm)' 
    end 
    object CDS1Length_In: TFloatField 
     FieldName = 'Length_In' 
    end 
    object CDS1Notes: TMemoField 
     FieldName = 'Notes' 
     BlobType = ftMemo 
     Size = 50 
    end 
    object CDS1Graphic: TGraphicField 
     FieldName = 'Graphic' 
     BlobType = ftGraphic 
    end 
    end 
    object DataSource1: TDataSource 
    DataSet = CDS1 
    Left = 104 
    Top = 32 
    end 
    object BindingsList1: TBindingsList 
    Methods = <> 
    OutputConverters = <> 
    Left = 40 
    Top = 152 
    object LinkControlToField2: TLinkControlToField 
     Category = 'Quick Bindings' 
     DataSource = BindSourceDB1 
     FieldName = 'Graphic' 
     Control = ImageControl1 
     Track = False 
    end 
    object LinkGridToDataSource1: TLinkGridToDataSource 
     Category = 'Quick Bindings' 
     DataSource = BindSourceDB1 
     GridControl = StringGrid1 
     Columns = <> 
    end 
    end 
    object BindSourceDB1: TBindSourceDB 
    DataSet = CDS1 
    ScopeMappings = <> 
    Left = 40 
    Top = 88 
    end 
    object TetheringManager1: TTetheringManager 
    OnPairedFromLocal = TetheringManager1PairedFromLocal 
    Text = 'TetheringManager1' 
    AllowedAdapters = 'Network' 
    Left = 40 
    Top = 240 
    end 
    object TetheringAppProfile1: TTetheringAppProfile 
    Manager = TetheringManager1 
    Text = 'TetheringAppProfile1' 
    Group = 'MAGroup' 
    Actions = <> 
    Resources = < 
     item 
     Name = 'BioLife' 
     IsPublic = True 
     Kind = Mirror 
     ResType = Stream 
     OnResourceReceived = TetheringAppProfile1ResourceReceived 
     end> 
    OnResourceReceived = TetheringAppProfile1ResourceReceived 
    Left = 224 
    Top = 240 
    end 
end 

TClientDataSets scheinen mit Livebindings gut zu funktionieren, wenn Sie also nach wie vor Probleme, es haben, werden Es könnte sich lohnen, die Datenübertragung auf die gleiche Weise wie ich durchzuführen.

Was Ihre zweite q

Wie alle Bilder aus Server-Datenbank kopieren und auf dem Client erstellten Ordner [Client \ db \ images] speichern?

Wenn Sie eine TClientDataSet verwenden, um die Daten auf dem Client zu halten (auch wenn Sie es mit einigen Livebindings Mechanismus Anzeige), können Sie es auf dem Client speichern, indem einfach die SaveToFile Methode des CDS aufrufen.

+0

Ich brauche mit einem Klick alle Bilder von Server DB zu Client DB kopieren! –

+0

Ich denke, müssen Splite AResource.Value.AsStream ... –

+0

http://stackoverflow.com/questions/42153215/how-to-get-images-from-server-using-app-erthering –

Verwandte Themen